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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM