利用JNI調(diào)用C/C++方法實(shí)現(xiàn)從控制臺(tái)輸入密碼
Posted on 2007-02-24 22:06 Zou Ang 閱讀(3675) 評論(6) 編輯 收藏 所屬分類:
最近看到一個(gè)問題,如何用Java實(shí)現(xiàn)從控制臺(tái)輸入密碼?
本來以為是很簡單的問題,查了一下發(fā)現(xiàn)Java居然沒提供這樣一個(gè)方法。目前實(shí)現(xiàn)的方式有2個(gè),一個(gè)是利用JNI來調(diào)用C/C++方法,另一個(gè)是使用多線程。
下面是使用JNI的方法:
首先,寫出我們的Java類:

























這一段使用System.loadLiberary("..");來加載本地類庫,PasswordDLL是文件名,不需要加dll后綴,系統(tǒng)會(huì)自動(dòng)辨認(rèn)。
編譯成JNIPasswordReader.class以后,使用
javah -jni JNIPasswordReader
命令,生成一個(gè)JNIPasswordReader.h文件,文件內(nèi)容如下:



























然后,我們需要寫一個(gè)cpp文件來實(shí)現(xiàn)
JNIEXPORT?jstring?JNICALL?Java_JNIPasswordReader_readPassword??(JNIEnv?*,?jobject);
接口。
于是,我寫了一個(gè)PasswordDLL.cpp文件,內(nèi)容如下:





















































我使用VS2005來生成對應(yīng)的dll文件,在生成之前,需要把$JDK_HOME/include/jni.h和$JDK_HOME/include/win32/jni_md.h這兩個(gè)文件copy到Microsoft Visio Studio 8/VC/include目錄下,我就在這里卡了大概1個(gè)小時(shí),一直說找不到j(luò)ni.h文件
然后就可以使用VS2005來生成dll了,生成好對應(yīng)的PasswordDLL.dll以后,把該dll文件放到系統(tǒng)變量PATH能找到的地方,比如windows/system32/或者jdk/bin目錄,我是放到JDK_HOME/bin下面了
放好以后,
執(zhí)行java JNIPasswordReader
就可以輸入密碼了。
關(guān)于JNI的更詳細(xì)內(nèi)容,可以參考:
《在Windows中實(shí)現(xiàn)Java本地方法》http://www.ibm.com/developerworks/cn/java/jnimthds/index.html
我的Password.dll文件
http://www.aygfsteel.com/Files/richardeee/PasswordDLL.zip