我有一些C代码实现了一个JNI方法,在调用时将jobject
返回给Java。在C代码中,我对struct
看起来有点像这样:
typedef struct {
char* something
int somethingElse
} awesomeStruct;
在C库中,我malloc
为结构提供了一些内存,也用于char*
。
当在JNI方法结束时返回jobject
时,我会这样做:
awesomeStruct *mystruct = getResult();
jstring somethingString;
jint somethingElseInt;
somethingString = (*env)->NewStringUTF(env,mystruct->something);
somethingElseInt = mystruct->somethingElse;
ret = (*env)->NewObject(env,javaClass,method,somethingString, somethingElseInt);
return ret;
Hopefuly,这应该使用字符串的两个参数和结构中的int调用method
上的javaClass
方法。
鉴于getResult()
对结构和char数组执行malloc
,我如何释放它?如果我尝试在return语句之前释放mystruct
或mystruct->something
,我会收到Debug assertion Failed - CrtlsValidHeapPointer
个错误,我猜这是因为返回对象包含对不再存在的事物的引用一旦我免费通话。
如何阻止这种泄漏?
答案 0 :(得分:0)
我在C端有类似JNI内存泄漏的类似问题有一个已分配的字符串(UTF Char数组仍保留在内存中),我用JNI内存释放命令解决了它就像那样;
(*env)->ReleaseStringUTFChars(env,jmessage,message);
它确实解决了我的问题,也许如果您在本网站上查看此文档,它可能是您的解决方案;
http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html