一、Eclipse 创建调用dll类,记住你的包名和类名,创建dll要用到

Eclipse JEE JAVA JNI 调用dll动态链接库(VC DLL)

二、设置调用dll路径,VC生成的dll要放在此目录,JAVA就可以加载了,在工程菜单->Properties->Java Build Path->Source->Native library location->edit:根据自己工程目录结构自己选择一个dll存放路径。我选择的是工程目录下lib目录。

Eclipse JEE JAVA JNI 调用dll动态链接库(VC DLL)

三、根据刚才创建的调用dll类,用VC制作dll动态链接库,文件->新建项目->Visual C++->Win32->Win32 控制台应用程序

名字自己随便。

Eclipse JEE JAVA JNI 调用dll动态链接库(VC DLL)

删除不用的cpp和h文件,我的目录结构如下图

Eclipse JEE JAVA JNI 调用dll动态链接库(VC DLL)

AESEncryption、Base64Encode、MD5Util、Tool是我自己创建的类。jni、jni_md.h在JAVA安装目录中搜索,复制到VC目录。

com_cnicfhnui_Tool_ZMDlib.cpp.h是根据刚才在JAVA中创建的类文件来命名

Eclipse JEE JAVA JNI 调用dll动态链接库(VC DLL)

com_cnicfhnui_Tool_ZMDlib.h内容,其中我自己实现了三个方法

Eclipse JEE JAVA JNI 调用dll动态链接库(VC DLL)

com_cnicfhnui_Tool_ZMDlib.cpp内容

#include"jni.h" 
#include "com_cnicfhnui_Tool_ZMDlib.h"  
#include<stdio.h>  
#include"jni_md.h"  
// AES 加密测试
JNIEXPORT jstring JNICALL Java_com_cnicfhnui_Tool_ZMDlib_AESEncryption
(JNIEnv *env, jobject thiz, jstring Encryption, jstring Key)
{
CTool mTool;
CAESEncryption mCAESEncryption;
CBase64Encode mCBase64Encode;
char Base64Result[4096];
unsigned char *EncryptionResultStr; // 128
const char *EncryptionStr = env->GetStringUTFChars(Encryption, 0);
const char *KeyStr = env->GetStringUTFChars(Key, 0);
aes_context ctx;// AES上下文结构体
int len = 0;
unsigned char CharKey[16];
//LOGE("Key:%s %lu", KeyStr,strlen(KeyStr));


if (strlen(KeyStr) != 16){
return env->NewStringUTF("KeyError");
}
if (mTool.IsCharacter((char *)KeyStr) != 0){
return env->NewStringUTF("KeyError");
}
memcpy(CharKey, KeyStr, 16);
printf("要加密的字符串:%s %s", EncryptionStr, KeyStr);
mCAESEncryption.aes_setkey_enc(&ctx, CharKey, 128);// 256);
printf("加密....");
EncryptionResultStr = mCAESEncryption.aes_crypt_ecb(&ctx, AES_ENCRYPT, (unsigned char *)EncryptionStr, strlen(EncryptionStr), &len);
printf("base64_encode....");
mCBase64Encode.base64_encode((unsigned char *)EncryptionResultStr, (char *)Base64Result, len);
printf("加密结果字符串:%s", Base64Result);
env->ReleaseStringUTFChars(Encryption, EncryptionStr);
env->ReleaseStringUTFChars(Key, KeyStr);
return env->NewStringUTF(Base64Result);
}
// AES 解密
JNIEXPORT jstring JNICALL Java_com_cnicfhnui_Tool_ZMDlib_AESDecryption
(JNIEnv *env, jobject thiz, jstring Decryption, jstring Key)
{
CTool mTool;
CAESEncryption mCAESEncryption;
CBase64Encode mCBase64Encode;
unsigned char Base64Decode[4096];
unsigned char *DecryptionResultStr; // 128
const char *DecryptionStr = env->GetStringUTFChars(Decryption, 0);
const char *KeyStr = env->GetStringUTFChars(Key, 0);
aes_context ctx;// AES上下文结构体
int len = 0;
unsigned char CharKey[16];
//LOGE("Key:%s %lu", KeyStr,strlen(KeyStr));


if (strlen(KeyStr) != 16){
return env->NewStringUTF("KeyError");
}
if (mTool.IsCharacter((char *)KeyStr) != 0){
return env->NewStringUTF("KeyError");
}
memcpy(CharKey, KeyStr, 16);
printf("要解密的字符串:%s  %s", DecryptionStr, KeyStr);
memset(Base64Decode, 0, 4096);
len = mCBase64Encode.base64_decode((char *)DecryptionStr, (unsigned char *)Base64Decode);
mCAESEncryption.aes_setkey_dec(&ctx, CharKey, 128);// 256);
int slen = 0;
DecryptionResultStr = mCAESEncryption.aes_crypt_ecb(&ctx, AES_DECRYPT, Base64Decode, len, &slen);
printf("解密....%d", slen);
DecryptionResultStr[slen] = '\0';
//DecryptionResultStr[slen + 1] = '\0';
printf("解密结果字符串:%s", DecryptionResultStr);
env->ReleaseStringUTFChars(Decryption, DecryptionStr);
env->ReleaseStringUTFChars(Key, KeyStr);
if (!mTool.IsUTF8((unsigned char*)DecryptionResultStr, strlen((char*)DecryptionResultStr)))
{
return env->NewStringUTF("No utf-8");
}
return env->NewStringUTF((char *)DecryptionResultStr);
}
// MD5 加密测试
JNIEXPORT jstring JNICALL Java_com_cnicfhnui_Tool_ZMDlib_MD5Encryption
(JNIEnv *env, jobject thiz, jstring Encryption)
{
CMD5Util mCMD5Util;
int i = 0;
const char *EncryptionStr = env->GetStringUTFChars(Encryption, 0);
printf("要加密的字符串:%s", EncryptionStr);
unsigned char digest[16];
unsigned char EncryptionResultStr[33]; // 128
mCMD5Util.Data((const unsigned char *)EncryptionStr, strlen(EncryptionStr), digest);
for (i = 0; i < 16; i++) {
EncryptionResultStr[(i * 2)] = ("0123456789ABCDEF"[digest[i] >> 4]);
EncryptionResultStr[(i * 2) + 1] = ("0123456789ABCDEF"[digest[i] & 0x0f]);
}
EncryptionResultStr[32] = 0;
env->ReleaseStringUTFChars(Encryption, EncryptionStr);
return env->NewStringUTF((char *)EncryptionResultStr);

}

四、生成dll并调用,编译VC工程得到dll文件,编译之前关闭对应文件的预编译头,就是stdafx.h,在cpp文件右键属性,C/C++->预编译头->不使用预编译头。注意平台,如果安装的是64位JAVA,VC要新建X64平台编译dll,否则不能调用,提示错误Can't load IA 32-bit .dll on a AMD 64-bit platform。默认32位

Eclipse JEE JAVA JNI 调用dll动态链接库(VC DLL)

编译生成

Eclipse JEE JAVA JNI 调用dll动态链接库(VC DLL)

把dll复制到刚才Eclipse 中Properties->Java Build Path->Source->Native library location->edit设置的目录中

在Eclipse 中调用

ZMDlib mZMDlib = new ZMDlib();  

        String AESEncryptionResult = mZMDlib.AESEncryption("AES加密测试,中文英文1234567890ABCDEF,./","1234567890abcdEF");
        System.out.print("AES加密结果:"+AESEncryptionResult+"\r\n");//84BsN1Sy4F27e11ole6woKjO+/NB5K5ubX4EflB5zXBuOCRrA+G/gtd/GMbemW0TZxOQb3wy3XLG2hdVSVwhKQ==


        String AESDecryptionResult = mZMDlib.AESDecryption("84BsN1Sy4F27e11ole6woKjO+/NB5K5ubX4EflB5zXBuOCRrA+G/gtd/GMbemW0TZxOQb3wy3XLG2hdVSVwhKQ==","1234567890abcdEF");
        System.out.print("AES解密结果:"+AESDecryptionResult+"\r\n");//AES加密测试,中文英文1234567890ABCDEF,./

        String MD5EncryptionResult = mZMDlib.MD5Encryption("84BsN1Sy4F27e11ole6woKjO+/NB5K5ubX4EflB5zXBuOCRrA+G/gtd/GMbemW0TZxOQb3wy3XLG2hdVSVwhKQ==");
        System.out.print("MD5加密结果:" + MD5EncryptionResult+"\r\n");//A0532310DFC9C3F87962B23A29049DFE

Eclipse JEE JAVA JNI 调用dll动态链接库(VC DLL)

相关文章: