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
