jni 全局引用以及局部引用

什麼情況下需要釋放局部引用對象:
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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章