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

本文介绍了一个使用JNI(Java本地接口)实现的密码读取器。该读取器能够通过C++代码实现密码输入时的星号显示,从而保护用户的密码安全。文章详细展示了从Java接口定义到C++实现的全过程,并提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虽然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、付费专栏及课程。

余额充值