1. 程式人生 > >JNI手動釋放記憶體(避免記憶體洩露)

JNI手動釋放記憶體(避免記憶體洩露)

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