虽然jdk6中已经可以实现密码屏蔽,但是调用jni还是有意义的, 以防以后忘记如何调用jni,简单做个记录.
java代码
public class JNIPasswordReader {
public native String readPassword();
static {
System.loadLibrary("SyjPasswordDLL");
}
}
c++代码
SyjPasswordDLL.cpp
#include "JNIPasswordReader.h"
#include <iostream>
#include <iomanip>
#include <conio.h>
using namespace std;
JNIEXPORT jstring JNICALL Java_com_syj_jni_PasswordReader_JNIPasswordReader_readPassword
(JNIEnv * env, jobject) {
jstring jstr;
const int pwdlen=128;
char pwd[pwdlen]={0};
int inputchar;
for(int i =0;i<pwdlen;){
inputchar=_getch();
if (31<inputchar && inputchar<127){
pwd[i++]=inputchar;
cout << '*';
}else if (inputchar == 10 || inputchar == 13){
break ;
}else if (inputchar==8 && i>0){
pwd[--i]=0;
cout << "/b /b";
}
}
jstr = env -> NewStringUTF(pwd);
return jstr;
}
javah -jni com.syj.jni.PasswordReader.JNIPasswordReader生成com_syj_jni_PasswordReader_JNIPasswordReader.h文件重命名为JNIPasswordReader.h
#include <jni.h>
/* Header for class com_syj_jni_PasswordReader_JNIPasswordReader */
#ifndef _Included_com_syj_jni_PasswordReader_JNIPasswordReader
#define _Included_com_syj_jni_PasswordReader_JNIPasswordReader
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_syj_jni_PasswordReader_JNIPasswordReader
* Method: readPassword
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_syj_jni_PasswordReader_JNIPasswordReader_readPassword
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
把$JAVA_HOME/include/jni.h和$JAVA_HOME/include/win32/jni_md.h这两个文件copy到Microsoft Visio Studio 8/VC/include目录下
VS2005->新建项目->Visual C++->win32->win32项目->应用程序设置->dll->ok生成解决方案.
将生成的dll文件重命名为SyjPasswordDLL.dll,放到path中,例如system32下面
public static void main(String[] args) {
System.out.println(" "+new JNIPasswordReader().readPassword());
}
}
至此收工.
在这里需要注意的是
如果定义为 public static native String readPassword();生成
JNIEXPORT jstring JNICALL Java_com_syj_jni_PasswordReader_JNIPasswordReader_readPassword
(JNIEnv *, jclass);
如果定义为public native String readPassword();生成
JNIEXPORT jstring JNICALL Java_com_syj_jni_PasswordReader_JNIPasswordReader_readPassword
(JNIEnv *, jobject);
jclass与jobject的差别,jclass是不对的,生成的dll连接不上,应该是jobject,
生成.h文件前应该写成
public native String readPassword();
待生成dll文件后改为
public static native String readPassword();是可以的.