编写好声明jni的java类并编译后,打开cmd窗口,进入X:/workspace/ProjectName/bin目录下后,使用命令:javah -jni com.aa.bb.JNITest,将在bin目录下生成一个com_aa_bb_JNITest.h文件。使用vc工具将该文件所声明的jni方法实现,并编译为dll文件后,再将dll文件放在java.library.path路径中,就可以在工程ProjectName的任何一个地方调用类JNITest的方法,如果仅仅将JNITest放在默认包中的话,在项目中的其他包中的类就不能访问这个处于默认包中的JNITest。
过程:
1.编写jni类并编译为class:
package net.base.util;
public class DesUtil{
static{
System.loadLibrary("DesUtil");
}
public static native int[] getDesIntArray(String key,int[] rssiIn,int dataLen);
public int[] decryptDes(String key,String encrypt_rssiData,int len){
int[] input=Hex2IntArray(encrypt_rssiData);
System.out.println("java传入密文为:("+input.length+")");
for(int i=0;i<input.length;i++){
System.out.print(Integer.toHexString(input[i])+" ");
}
System.out.println();
int[] output=getDesIntArray(key,input,len);//"4C16BEE09599C198",8);
System.out.println("java收到dll解密后的明文为:("+output.length+")");
for(int i=0;i<output.length;i++){
System.out.print(Integer.toHexString(output[i])+" ");
}
return output;
}
public int[] Hex2IntArray(String hexEncrypetString){
String[] hexs=hexEncrypetString.split(" ");
int[] input=new int[hexs.length];
for(int i=0;i<hexs.length;i++){
input[i]=ProtocalFormatter.Hex2Int(hexs[i]);
}
return input;
}
}
2.打开cmd窗口,进入X:/workspace/ProjectName/bin目录下后,使用命令:javah -jni net.base.util.DesUtil,命令完成后会在bin目录下生成一个net_base_util_DesUtil.h的头文件。
3.下载vc6.0:http://xxx1.gd.xdowns.com:8081/x/086/VC6.rar,解压后安装。
4.打开vc6.0,新建“工程”-“Win32 Dynamic-Link Library”,工程名“DesUtil”。
5.进入工程文件保存目录X:/vc6/MyProjects/DesUtil,将net_base_util_DesUtil.h拷贝到DesUtil。
6.选中“FileView”,右击“Header Files”-“添加文件到目录...”,将5中的net_base_util_DesUtil.h添加进来。
7.同样的方法添加其他需要的头文件到Header Files,比如:d3des.h
8.选中“FileView”,选中“Source Files”,“文件”-“新建”-“文件”-“c++ Source File”,文件名“net_base_util_DesUtil”。将在“Source Files”下出现一个net_base_util_DesUtil.cpp文件。
9.编写cpp文件:
#include <stdio.h>
#include <string.h>
#include "d3des.h"
#include "net_base_util_DesUtil.h"
#include "stdlib.h"
#include "string.h"
#include <windows.h>
int DesDecrypt(const char * szKey, char *lpbySrc, char *lpbyDest, int iLength); //声明方法
JNIEXPORT jintArray JNICALL Java_net_base_util_DesUtil_getDesIntArray(JNIEnv * env, jclass b, jstring key, jintArray rssiIn, jint dataLen){
if(rssiIn==NULL)
{
return NULL;
}
int len=dataLen;
char inputt[1024];
//jsize jlen = (env)->GetArrayLength(rssiIn);
jint* body = (env)->GetIntArrayElements(rssiIn, 0);
for(int x=0;x<len;x++){
char yy=body[x];
inputt[x]=yy;
}
//cout << "收到密文:"<< endl;
//for (int ie=0; ie<len; ie++){
//cout << (output[i]&0xff)<< endl;
//printf("%.2x ",inputt[ie]&0xff);//printf("%2x ",output[i]&0xff);
//}
//printf("/n");
const char* keys=env->GetStringUTFChars(key, 0);
int i;
char output[1024];
//printf("key :%s/n" , keys);
//解密
DesDecrypt(keys,inputt, output,len);
//int rlen=sizeof(output);
jintArray iarr = (*env).NewIntArray(len);
jint buf[1024];
env->GetIntArrayRegion(iarr, 0, len, buf);
//cout << "解密后明文:"<< endl;
for (i=0; i<len; i++){
//printf("%.2x ",output[i]&0xff);//printf("%2x ",output[i]&0xff);
buf[i]=output[i]&0xff;
}
//printf("/n");
env->SetIntArrayRegion(iarr, 0, len, buf);
/*
char input[8]= {0xdf,0xff,0xff,0xff,0x40,0x00,0x27,0xe0};
//result is 0xfd 0xb8 0x0c 0x3e 0xb8 0xcb 0xd7 0x4f
char outputs[8];
int j;
DesEncrypt(keys,input, outputs,8);
for (j=0; j<8; j++)
printf("%2x ",outputs[j]&0xff);
printf("/n");
int k;
DesDecrypt(keys,outputs, output,len);
for (k=0; k<sizeof(output); k++){
//cout << (output[i]&0xff)<< endl;
printf("%2x ",output[k]&0xff);//printf("%2x ",output[i]&0xff);
}
printf("/n");
*/
return iarr;
}
...
10.组建dll:选择“组建”-“组建[DesUtil.dll]”,如果没有错误,将在X:/vc6/MyProjects/DesUtil/Debug目录下产生一个DesUtil.dll的文件。
11.将dll文件放在java.library.path路径中,就可以在工程ProjectName的任何一个地方调用类DesUtil的getDesIntArray方法。