【问题标题】:Preventing memory leaks with JNI return object使用 JNI 返回对象防止内存泄漏
【发布时间】:2013-11-01 16:26:01
【问题描述】:

我有一些 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;

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

鉴于getResult() 为结构和字符数组执行malloc,我该如何释放它?如果我尝试在 return 语句之前释放 mystructmystruct->something,我会收到 Debug assertion Failed - CrtlsValidHeapPointer 错误,我猜这是因为返回对象包含对一旦我调用 free 就不再存在的事物的引用。

如何阻止这种泄漏?

【问题讨论】:

  • 您的代码对我来说看起来不错(但请等待更好的答案,以防我完全错了)也许该错误与您为 awesomeStruct *mystructchar* something 分配内存的方式有关因此,您在尝试释放分配的内存时会得到Debug assertion Failed - CrtlsValidHeapPointer。如果你完全确定你以正确的方式分配内存,你可以忘记这条评论。
  • getResult() 只是做了一个awesomeStruct mystruct = (awesomeStruct*)malloc(sizeof(awesomeStruct)); 我不完全确定这是否是“正确”的方式,但我有限的知识告诉我,我应该在某个时候释放它。
  • 对,你必须释放分配的内存。那么char *something 呢?呵呵,只是为了好奇:P
  • 我忘记了——我对它和结构做了一个mallocmalloc struct,然后 malloc 里面的char*
  • 你应该能够在调用 NewStringUTF 之后释放 mystruct->something 并且能够在调用 NewObject 之后释放 awesomeStruct *。如果你释放 mystruct->mystruct DTOR AND elsewehere 中的某些东西,你可能会遇到“双重释放”问题。

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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-01-26
    • 2017-04-15
    • 2010-12-20
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 2015-02-05
    相关资源
    最近更新 更多