私のアプリは 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 によって返される配列は、次を使用して解放する必要があります。
(*env)->ReleaseStringUTFChars(env, jstr, myObjArray[i].name);
(*env)->ReleaseLocalRef(env, jstr);
- 返された配列を場所 A で解放すると、myObjArray.name は空になります
- 返された配列を場所 B で解放すると、jstring の参照が保持されるため、「JNI ローカル ref テーブルへの追加に失敗しました (512 エントリがあります)」が発生します。
私の質問は次のとおりです: jstring を正しく解放したい場合、どうすればよいですか?