local reference table overflow
JNI层coding经常会遇到ReferenceTable overflow问题,特别是当jni函数被反复调用上千上万次的时候,现汇总如下,未完待续,并欢迎补充,(*^__^*) 嘻嘻……
总体原则:释放所有对object的引用
1.FindClass
例如,
jclass ref= (env)->
FindClass("java/lang/String");
env->
DeleteLocalRef(ref);
2.NewString/ NewStringUTF/NewObject/NewByteArray
例如,
jstring (*NewString)(JNIEnv*, const jchar*, jsize);
const jchar* (*
GetStringChars)(JNIEnv*, jstring, jboolean*);
void (*
ReleaseStringChars)(JNIEnv*, jstring, const jchar*);
jstring (*NewStringUTF)(JNIEnv*, const char*);
const char* (*
GetStringUTFChars)(JNIEnv*, jstring, jboolean*);
void (*
ReleaseStringUTFChars)(JNIEnv*, jstring, const char*);
env->
DeleteLocalRef(ref);
3.
GetObjectField/GetObjectClass/GetObjectArrayElement
jclass ref = env->GetObjectClass(robj);
env->
DeleteLocalRef(ref);
4.GetByteArrayElements
jbyte* array= (*env)->
GetByteArrayElements(env,jarray,&isCopy);
(*env)->
ReleaseByteArrayElements(env,jarray,array,0);
4.const char* input =(*env)->
GetStringUTFChars(env,jinput, &isCopy);
(*env)->
ReleaseStringUTFChars(env,jinput,input);
5.NewGlobalRef/DeleteGlobalRef
jobject (*
NewGlobalRef)(JNIEnv*, jobject);
void (*
DeleteGlobalRef)(JNIEnv*, jobject);
例如,
jobject ref= env->
NewGlobalRef(customObj);
env->
DeleteGlobalRef(customObj);