JNI手動釋放記憶體(避免記憶體洩露)
阿新 • • 發佈:2019-02-09
1. 哪些需要手動釋放?
不要手動釋放(基本型別): jint , jlong , jchar
需要手動釋放(引用型別,陣列家族): jstring,jobject ,jobjectArray,jintArray ,jclass ,jmethodID
2. 釋放方法
2.1 jstring & char *
// 建立 jstring 和 char*
jstring jstr = (*jniEnv)->CallObjectMethod(jniEnv, mPerson, getName);
char* cstr = (char*) (*jniEnv)-> GetStringUTFChars(jniEnv,jstr, 0);
// 釋放
(*jniEnv)->ReleaseStringUTFChars(jniEnv, jstr, cstr);
(*jniEnv)->DeleteLocalRef(jniEnv, jstr);
2.2 jobject,jobjectArray,jclass ,jmethodID等引用型別
(*jniEnv)->DeleteLocalRef(jniEnv, XXX);
2.3 jbyteArray
jbyteArray audioArray = jnienv->NewByteArray (frameSize);
jnienv->DeleteLocalRef(audioArray);
2.4 GetByteArrayElements
jbyte* array= (*env)->GetByteArrayElements(env,jarray,&isCopy);
(*env)->ReleaseByteArrayElements(env,jarray,array,0);
2.5 NewGlobalRef
jobject ref= env->NewGlobalRef(customObj);
env->DeleteGlobalRef(customObj);
3. 避免記憶體洩露
JNI如果建立以上引用卻不手動釋放的話很容易就造成記憶體洩露,所以JNI程式設計建立的引用型別一定要手動釋放(切身教訓),檢測記憶體洩露可以使用Jprofiler