我的应用需要使用 jni。逻辑看起来像:
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 doc,GetStringUTFChars 返回的数组应该使用 relased
(*env)->ReleaseStringUTFChars(env, jstr, myObjArray[i].name);
(*env)->ReleaseLocalRef(env, jstr);
- 如果我在位置 A 释放返回的数组,则 myObjArray.name 将为空
- 如果我在位置 B 释放返回的数组,因为我将保留 jstring 的引用,那么“添加到 JNI 本地引用表失败(有 512 个条目)”将发生
我的问题是:如果我想正确释放 jstring,我该怎么办?