java调用C++实现口令屏蔽

虽然jdk6中已经可以实现密码屏蔽,但是调用jni还是有意义的, 以防以后忘记如何调用jni,简单做个记录.

java代码

 

package  com.syj.jni.PasswordReader;

public   class  JNIPasswordReader {
    
public   native  String readPassword();

    
static  {
        System.loadLibrary(
" SyjPasswordDLL " );
    }
}

 

c++代码

SyjPasswordDLL.cpp 

#include  " stdafx.h "
#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

 

/*  DO NOT EDIT THIS FILE - it is machine generated  */
#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   class  TestJNIPasswordReader {
    
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();是可以的.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值