2014年2月12日 星期三

[Android] Avoid "Reference Table Overflow" issue in JNI

下面這些function 需要自己release reference, 不能仰賴vm去回收

1. FindClass:
jclass cls = env->FindClass("java/lang/String");
env->DeleteLocalRef(cls);

2. NewString/ NewStringUTF/NewObject/NewByteArray:
jstring  str =  env->NewStringUTF(const char*);
env->DeleteLocalRef(str);

3. GetObjectField/GetObjectClass/GetObjectArrayElement:
jclass ref = env->GetObjectClass(robj);
env->DeleteLocalRef(str);

4. GetByteArrayElements:
jbyte* array = env->GetByteArrayElements(jarray, &isCopy);
env->ReleaseByteArrayElements(jarray, array, 0);

5. GetStringUTFChars/GetStringChars:
const char* input = env->GetStringUTFChars(jinput, &isCopy);
env->ReleaseStringUTFChars(jinput, input);

6. NewGlobalRef:
jobject ref= env->NewGlobalRef(customObj);
env->DeleteGlobalRef(customObj);