【问题标题】:JNI how to release itJNI如何释放它
【发布时间】:2013-06-04 06:38:30
【问题描述】:

我是一个JNI navice,一个关于释放内存的问题阻止了我,场景如下: 如果您已将 ArrayList 从 Java 转换为 C,并将 ArrayList 元素从 String 数组中放入:

 jclass arrlist_cls = (*env)->FindClass(env,"java/util/ArrayList");
 if(NULL==arrlist_cls)return;
 jmethodID m_get = (*env)->GetMethodID(env,arrlist_cls,"get","(I)Ljava/lang/Object");
 jmethodID m_size = (*env)->GetMethodID(env,arrlist_cls,"size","()I");

 //get the ArrayList field from object
 jfieldID fidArrStr = (*env)->GetFieldID(env,helloObj,"arrStr",
   "Ljava/util/ArrayList;");
 jobject ArrObj = (*env)->GetObjectField(env,paramsObj,fidArrStr);
 if(NULL==ArrObj)return;
 int len = (*env)->CallIntMethod(env,ArrObj,size_method);
 int i=0; const char **ArrStr;
 for(i=0;i<len;i++){
     jstring jstr = (jstring)(*env)->CallObjectMethod(env,ArrObj,get_method,i);
     ArrStr[i]=jstr;
 }

我怎样才能像单个String一样释放它?你知道,单个String可以使用ReleaseStringUTFChars的方法来释放, 如何释放数组对象内存?因为 String 不是原始类型,所以我找不到 ReleaseArrayElements 方法来使用。

【问题讨论】:

  • 您的问题似乎与 JNI 无关。这里没有“数组对象内存”。您似乎正在寻找 free() 函数;否则不是一个真正的问题。
  • 请显示更多您的代码。尚不清楚分配给strArr 的内容。
  • 你好,我添加了这个问题的一些代码和详细过程,你能看看吗? :-)
  • 一般它不会被释放,它只是逃跑。 (什么?哦,我以为你在谈论应用程序。)
  • 看什么?你在问什么? ArrObj? ArrStr?这里有什么问题?

标签: java-native-interface


【解决方案1】:

我的意思是如何释放 ArrStr。

这段代码甚至不起作用:当你执行 ArrStr[i] = ... 时它会得到一个 SIGSEGV 所以我不知道你为什么还担心终止。

您需要分配 ArrStr 才能使用它。你如何分配它决定了你如何释放它。如果你用new 分配它,你必须用delete 释放它。如果你将它分配为一个数组,即char *ArrStr[len],它会在方法退出时消失:不需要释放。

如果您询问如何释放CallObjectMethod() 返回的jstrings,当您退出此JNI 方法时,JNI 会自动释放它们。如有必要,您可以在此之前明确释放它们,使用DeleteLocalRef()

【讨论】:

  • 非常感谢您的回答,我对 C 语言不是很熟悉。我在 C 中定义了一个数组 const char **arrStr ,但是这个数组长度取决于 Java 的 ArrayList 对象。所以我不确定这个数组是否应该在编译时分配内存。从 JNI API 中,我看到 jstring 和其他一些 Array 对象具有可以帮助发布的 API,所以我认为 ArrStr 也需要发布。
  • const char **ArrStr 不是数组。它是一个指向指针的指针。如果你想让它指向你必须安排的东西,例如= calloc(len, sizeof char*);,然后是 free()。它是一个 C 对象,与 JNI API 无关。
  • 所以你认为,我只需要使用 free() 释放它?
  • 大卫,我不知道你为什么要我重复一遍。你需要重新阅读我写的东西。我刚才已经完全说了,我还说了其他对这个问题有重大影响的事情。
猜你喜欢
  • 2012-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 2010-12-04
  • 1970-01-01
相关资源
最近更新 更多