JNI调用C/C++方法从控制台输入密码
2008-07-03 16:30
459 查看
如何用Java实现从控制台输入密码?目前实现的方式有2个,一个是利用JNI来调用C/C++方法,另一个是使用多线程。下面是使用JNI的方法:首先,写出我们的Java类:
这一段使用System.loadLiberary("..");来加载本地类库,PasswordDLL是文件名,不需要加dll后缀,系统会自动辨认。
编译成JNIPasswordReader.class以后,使用 javah -jni JNIPasswordReader 命令,生成一个JNIPasswordReader.h文件,文件内容如下:
然后,写一个cpp文件来实现
JNIEXPORT jstring JNICALL Java_JNIPasswordReader_readPassword (JNIEnv *, jobject);接口。
写一个PasswordDLL.cpp文件,内容如下:
使用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的实现过程,当然本身这个例子也具有实际用处哦。如果你想象力够丰富的话…………。哈哈哈哈,不说了。说多了容易教坏人滴。哈哈哈
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的实现过程,当然本身这个例子也具有实际用处哦。如果你想象力够丰富的话…………。哈哈哈哈,不说了。说多了容易教坏人滴。哈哈哈
相关文章推荐
- python实现在控制台输入密码不显示的方法
- Android(安卓)开发通过NDK调用JNI,使用opencv做本地c++代码开发配置方法 边缘检测 范例代码
- JNI技术---clojure 调用C++库的方法
- JNI中JAVA调用C/C++方法
- 入门: 使用JNI 从C++代码中调用Java的静态方法
- Android-使用C++实现调用本地方法返回字符串显示在界面上/NDK-JNI开发实例(八)
- cocos2d 中使用jni C++ 调用 Java 方法
- Android调用C++OpenCV程序的方法(NDK+JNI)
- Android-NDK开发之基础--Android JNI实例代码(一)-- 在JNI中执行Java方法--C/C++调用Java
- cocos2d 中使用jni Java 调用 C++ 方法
- android实现app通过jni调用C/C++方法
- 在java中调用c/c++代码的方法(jni)
- Android-NDK开发之基础--Android JNI实例代码(一)-- 在JNI中执行Java方法--C/C++调用Java
- 在eclipse下,JAVA通过JNI调用C++方法的简单例子(非android)
- Android(安卓)开发通过NDK调用JNI,使用opencv做本地c++代码开发配置方法实现边缘检测代码(2)
- C#实现在控制台输入密码显示星号的方法
- Android(安卓)开发通过NDK调用JNI,使用opencv做本地c++代码开发配置方法 边缘检测 范例代码
- Java使用JNI调用C/C++方法
- 利用JNI在vs2010上实现c++调用Java类方法
- 3Java程序JNI调用C++之修改属性调用方法