gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:45:51 25 4
gpt4 key购买 nike

我有一些 C 代码,它实现了 JNI 方法,以便在调用时将 jobject 返回到 Java。在 C 代码中,我对一个看起来有点像这样的 struct 进行了一些研究:

typedef struct {
char* something
int somethingElse
} awesomeStruct;

在 C 库中,我为结构体以及 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;

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

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

如何阻止这种泄漏?

最佳答案

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

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

它确实解决了我的问题,所以,如果您查看过此网站上的文档,也许它可以为您提供解决方案;

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

关于java - 使用 JNI 返回对象防止内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19540932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com