使用JNI返回对象防止内存泄漏

时间:2013-10-23 11:53:14

标签: java c memory-leaks java-native-interface

我有一些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语句之前释放mystructmystruct->something,我会收到Debug assertion Failed - CrtlsValidHeapPointer个错误,我猜这是因为返回对象包含对不再存在的事物的引用一旦我免费通话。

如何阻止这种泄漏?

1 个答案:

答案 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