jni jvm 内存泄漏_jni的内存泄漏问题

#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是里面的加密类,先不考虑这个类里面有问题的情况,帮我看看我写的这个接口类有没有什么问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值