您的位置:首页 > 编程语言 > C语言/C++

JNI调用C/C++方法从控制台输入密码

2008-07-03 16:30 411 查看
如何用Java实现从控制台输入密码?目前实现的方式有2个,一个是利用JNI来调用C/C++方法,另一个是使用多线程。下面是使用JNI的方法:首先,写出我们的Java类:  

public   class  JNIPasswordReader  {

private   native  String readPassword();

static {

System.loadLibrary( " PasswordDLL " );

}

/**

*  @param  args

*/

public   static   void  main(String[] args)  {

//  TODO Auto-generated method stub

JNIPasswordReader reader  =   new  JNIPasswordReader();

String pwd  =  reader.readPassword();

System.out.println( " nYour Password is: "   +  pwd);

}

}

  这一段使用System.loadLiberary("..");来加载本地类库,PasswordDLL是文件名,不需要加dll后缀,系统会自动辨认。

编译成JNIPasswordReader.class以后,使用 javah -jni JNIPasswordReader 命令,生成一个JNIPasswordReader.h文件,文件内容如下:   

/*  DO NOT EDIT THIS FILE - it is machine generated  */

#include  < jni.h >

/*  Header for class JNIPasswordReader  */

#ifndef _Included_JNIPasswordReader

#define  _Included_JNIPasswordReader

#ifdef __cplusplus

extern   " C "   {

#endif

/*

* Class:     JNIPasswordReader

* Method:    readPassword

* Signature: ()Ljava/lang/String;

*/

JNIEXPORT jstring JNICALL Java_JNIPasswordReader_readPassword

(JNIEnv  * , jobject);

#ifdef __cplusplus

}

#endif

#endif

然后,写一个cpp文件来实现
JNIEXPORT jstring JNICALL Java_JNIPasswordReader_readPassword  (JNIEnv *, jobject);接口。

写一个PasswordDLL.cpp文件,内容如下:

#include  " JNIPasswordReader.h "

#include  < iostream >

#include  < iomanip >

#include  < conio.h >

using   namespace  std;

JNIEXPORT jstring JNICALL Java_JNIPasswordReader_readPassword

(JNIEnv  *  env, jobject) {

char  str[ 20 ]  =   { 0 } ;

jstring jstr;

char  ch;

char   * pstr  =  str;

while ( true )

{

ch  =  getch();

if (isdigit(ch) || isalpha(ch))

{

cout << " * " ;

* pstr ++   =  ch;

}

else   if (ch  ==   ' b '   &&  pstr  >  str)

{

* ( -- pstr)  =   0 ;

cout << " b b " ;

}

else   if (ch  ==   0x0A   ||  ch  ==   0x0D )

{

break ;

}

}

jstr  =  env -> NewStringUTF(str);

return  jstr;

}

    使用Visual c++6.0来生成对应的dll文件,在生成之前,需要把$JDK_HOME/include/jni.h和$JDK_HOME/include/win32/jni_md.h这两个文件copy到Microsoft Visual Studio/VC98/Include目录下

    然后就可以生成dll了,生成好对应的PasswordDLL.dll以后,把该dll文件放到系统变量PATH能找到的地方,比如windows/system32/或者jdk/bin目录,我是在工作目录下建立一个dll目录,专门存放dll,并在系统变量path中配置好。下面了放好以后,执行java JNIPasswordReader 就可以输入密码了。运行结果如下所示  



怎么样是不是很有意思,通过这个例子可以学习一下JNI的实现过程,当然本身这个例子也具有实际用处哦。如果你想象力够丰富的话…………。哈哈哈哈,不说了。说多了容易教坏人滴。哈哈哈
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息