我是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 方法来使用。
答案 0 :(得分:1)
我的意思是如何发布ArrStr。
此代码甚至不起作用:当您执行SIGSEGV
时,它会获得ArrStr[i] = ...
所以我不知道为什么你担心终止。
您需要分配 ArrStr
才能使用它。如何分配它决定了你如何发布它。如果您使用new
进行分配,则必须使用delete
将其分发。如果将其分配为数组,即char *ArrStr[len]
,则当方法退出时它将消失:无需释放。
如果您询问如何释放jstrings
返回的CallObjectMethod()
,那么当您退出此JNI方法时,JNI会自动释放它们。如有必要,您可以使用DeleteLocalRef()
明确释放它们。