0

我有一些 C 代码实现了一个 JNI 方法,jobject以便在调用时返回给 Java。在 C 代码中,我使用了一个struct看起来有点像这样的东西:

typedef struct {
    char* something
    int somethingElse
} awesomeStruct;

在 C 库中,我malloc为 struct 和char*.

jobject在 JNI 方法的末尾返回时,我会执行以下操作:

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;

希望这应该使用字符串的两个参数和结构中的 int调用method方法。javaClass

鉴于对 struct 和 char 数组做getResult()了 a malloc,我该如何释放它?如果我尝试在 return 语句中mystruct或之前释放,我会收到错误,我猜这是由于返回对象包含对一旦我调用 free 就不再存在的事物的引用。mystruct->somethingDebug assertion Failed - CrtlsValidHeapPointer

我该如何阻止这种泄漏?

4

1 回答 1

0

我在 C 端遇到了与 JNI 内存泄漏类似的问题 有一个分配的字符串(UTF Char 数组仍然在内存中),我用 JNI 内存释放命令解决了它,就像这样;

(*env)->ReleaseStringUTFChars(env,jmessage,message);

它确实解决了我的问题,也许如果你在这个网站上查看过这个文档,它可能是你的解决方案;

http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html

于 2016-01-28T23:34:06.883 回答