我的應用需要使用jni。邏輯是這樣的:如何正確釋放循環中的jstring?
void myJniFunc(JNIEnv *env, jclass clazz, jobjectArray items) {
int count = 10;
struct MyObj *myObjArray = (struct MyObj*)malloc(sizeof(struct MyObj) * count);
for (i = 0; i < count; i++) {
jobject obj = (*env)->GetObjectArrayElement(env, items, i);
jfieldID fieldId = ...;
jstring jstr = (*env)->GetObjectField(env, obj, fieldId);
myObjArray[i].name = (*env)->GetStringUTFChars(env, jstr);
(*env)->DeleteLocalRef(env, obj);
// Location A
}
// some code which will use myObjArray
process(count, myObjectArray);
// Location B
}
並通過JNI的文檔,通過GetStringUTFChars陣列回報應該使用relased
(*env)->ReleaseStringUTFChars(env, jstr, myObjArray[i].name);
(*env)->ReleaseLocalRef(env, jstr);
- 如果我釋放在位置A返回數組,然後myObjArray.name會空
- 如果我釋放位置B返回的數組,因爲我會保留jstring的引用,那麼「失敗將添加到JNI本地ref表(有512個條目)」將會發生
我的問題是: 如果我想正確釋放jstring,該怎麼辦?
MyObj的「name」字段實際上是否應該保存'jstring',還是應該保存C'char *'?看起來好像是後者,在這種情況下,您應該從每個字符串中獲取字符並將它們複製到新分配的char數組中,然後將這些字符存儲在data數據字段中,然後釋放Java字符。 –
@Ernest Friedman-Hill對不起,我忘了添加一行調用「GetStringUTFChars」的行。我再次編輯問題。謝謝。 – cmoaciopm