JNI如何发布它

时间:2013-06-04 06:38:31

标签: java-native-interface

我是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 方法来使用。

1 个答案:

答案 0 :(得分:1)

  

我的意思是如何发布ArrStr。

此代码甚至不起作用:当您执行SIGSEGV时,它会获得ArrStr[i] = ...所以我不知道为什么你担心终止。

您需要分配 ArrStr才能使用它。如何分配它决定了你如何发布它。如果您使用new进行分配,则必须使用delete将其分发。如果将其分配为数组,即char *ArrStr[len],则当方法退出时它将消失:无需释放。

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