jni实现过程

来源:互联网 发布:域名冲突 编辑:程序博客网 时间:2024/05/01 14:32

编写好声明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方法。

原创粉丝点击