什麼情況下需要釋放局部引用對象:
1.訪問一個很大的java對象,使用完之後,還要進行復雜的耗時操作
2.創建了大量的局部引用,佔用了太多的內存,而且這些局部引用跟後面的操作沒有關聯性
// 在jni中告知虛擬機回收一個jni對象,在局部引用中通過DeleteLocalRef()來釋放內存
//循環創建數組,
JNIEXPORT void JNICALL Java_com_example_jnitest_MainActivity_localRef
(JNIEnv *env, jobject jobj){
int i = 0;
for (; i < 7; ++i) {
//創建date對象
jclass cls = (*env)->FindClass(env,"java/util/Date");
jmethodID method = (*env)->GetMethodID(env,cls,"<init>","()V");
jobject date = (*env)->NewObject(env,cls,method);
//如果不在使用局部date對象,通知垃圾回收器對date對象進行回收,
(*env)->DeleteLocalRef(env,date);
}
}
全局引用
釋放全局引用對象調用函數:DeleteGlobalRef(),釋放完之後,再此獲取全局引用就會拋異常,所以這個需要注意哦
jstring global_str;
//全局引用
JNIEXPORT void JNICALL Java_com_example_jnitest_MainActivity_createGlobalRef
(JNIEnv *env, jobject jobj){
jstring j_str = (*env)->NewStringUTF(env,"liutian is beautiful");
//NewGlobalRef 把局部變量提升爲全局引用
global_str = (*env)->NewGlobalRef(env,j_str);
};
JNIEXPORT jstring JNICALL Java_com_example_jnitest_MainActivity_getGlobalRef
(JNIEnv *env, jobject jobj){
//獲取全局對象
return global_str;
}
JNIEXPORT void JNICALL Java_com_example_jnitest_MainActivity_deleteGlobalRef
(JNIEnv *env, jobject jobj){
//釋放全局內存
(*env)->DeleteGlobalRef(env,global_str);
}