Eclipse JEE JAVA JNI 調用dll動態鏈接庫(VC DLL)

一、Eclipse 創建調用dll類,記住你的包名和類名,創建dll要用到


二、設置調用dll路徑,VC生成的dll要放在此目錄,JAVA就可以加載了,在工程菜單->Properties->Java Build Path->Source->Native library location->edit:根據自己工程目錄結構自己選擇一個dll存放路徑。我選擇的是工程目錄下lib目錄。


三、根據剛纔創建的調用dll類,用VC製作dll動態鏈接庫,文件->新建項目->Visual C++->Win32->Win32 控制檯應用程序

名字自己隨便。


刪除不用的cpp和h文件,我的目錄結構如下圖


AESEncryption、Base64Encode、MD5Util、Tool是我自己創建的類。jni、jni_md.h在JAVA安裝目錄中搜索,複製到VC目錄。

com_cnicfhnui_Tool_ZMDlib.cpp.h是根據剛纔在JAVA中創建的類文件來命名


com_cnicfhnui_Tool_ZMDlib.h內容,其中我自己實現了三個方法


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位


編譯生成


把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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章