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

























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



























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





















































我使用VS2005來(lái)生成對(duì)應(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í),一直說(shuō)找不到j(luò)ni.h文件
然后就可以使用VS2005來(lái)生成dll了,生成好對(duì)應(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