#include "tools_EncryptLib.h"
#include
#include "yxyDES.h"
#include
using namespace std;
//功能:读取文件得到密钥;
string getKey() {
char fileName[] = "C:\\key.txt";
ifstream in(fileName);
string line;
getline(in, line);
return line;
}
//功能:将Java的byte数组转换为C char *;
char * jbyteArrayToChar(JNIEnv * env, jbyteArray bytes)
{
char * rtn = NULL;
jsize len = env-> GetArrayLength(bytes);
printf("读取数据长度完成\r\n");
jbyte * arrayBody = env-> GetByteArrayElements(bytes,0);
if(len > 0)
{
rtn = new char[len+1];//(char *)malloc(len+1);
memcpy(rtn, arrayBody, len);
rtn[len]=0;
}
printf("拷贝数据完成\r\n");
env-> ReleaseByteArrayElements(bytes, arrayBody, 0);
printf("释放数据完成\r\n");
return rtn;
}
jstring stoJstring(JNIEnv* env, const char* pat)
{
jclass strClass = env->FindClass("Ljava/lang/String;");
jmethodID ctorID = env->GetMethodID(strClass, " ", "([BLjava/lang/String;)V");
jbyteArray bytes = env->NewByteArray(strlen(pat));
env->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat);
jstring encoding = env->NewStringUTF("utf-8");
return (jstring)env->NewObject(strClass, ctorID, bytes, encoding);
}
JNIEXPORT jstring JNICALL Java_tools_EncryptLib_encrypt
(JNIEnv * env, jobject obj, jbyteArray data, jbyteArray key) {
char* pKey = jbyteArrayToChar(env, key);
char* pData = jbyteArrayToChar(env, data);
printf("读取数据完成\r\n");
yxyDES* my_des = new yxyDES();
my_des->InitializeKey(pKey,false);
my_des->EncryptAnyLength(pData,false);
printf("加密数据完成\r\n");
jstring ret = stoJstring(env, my_des->GetCiphertextAnyLength());
printf("数据格式转换完成\r\n");
//当运行到这里的时候,有时候jvm会崩溃掉,不知道是因何原因
delete[] pKey;
pData = NULL;
delete[] pData;
pData = NULL;
delete my_des;
my_des = NULL;
printf("释放内存完成\r\n");
return ret;
}
/*JNIEXPORT jbyteArray JNICALL Java_java_lang_EncryptLib_decrypt
(JNIEnv * env, jobject obj, jbyteArray data, jbyteArray key) {
char* pKey = jbyteArrayToChar(env, key);
char* pData = jbyteArrayToChar(env, data);
yxyDES* my_des = new yxyDES();
my_des->InitializeKey(pKey,false);
my_des->DecryptAnyLength(pData,false);
char* ret = my_des->GetPlaintextAnyLength();
int len = strlen(ret);
ret[len] = 0;
jbyteArray bytearray;
bytearray = env->NewByteArray(len);
env->SetByteArrayRegion(bytearray, 0, len, (const signed char *)ret);
return bytearray;
}*/
JNIEXPORT jbyteArray JNICALL Java_tools_EncryptLib_getkey
(JNIEnv * env, jobject obj) {
string ret = getKey();
int len = ret.size();
jbyteArray bytearray;
bytearray = env->NewByteArray(len);
env->SetByteArrayRegion(bytearray, 0, len, (const signed char *)ret.c_str());
return bytearray;
}
以上是我写的jni调用的dll部分的代码,运行的时候会出现jvm直接崩溃的问题,那位大侠给看看,是不是有内存泄漏或者什么问题。yxyDES是里面的加密类,先不考虑这个类里面有问题的情况,帮我看看我写的这个接口类有没有什么问题。