0

我是一个 JNI 新手,一个关于释放内存的问题阻止了我,如下所示:如果您将 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方法。

4

1 回答 1

1

我的意思是如何释放 ArrStr。

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

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

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

于 2013-06-05T04:30:32.277 回答