【Android NDK 开发】JNI 引用 ( 弱全局引用 | NewWeakGlobalRef | DeleteWeakGlobalRef )
生活随笔
收集整理的這篇文章主要介紹了
【Android NDK 开发】JNI 引用 ( 弱全局引用 | NewWeakGlobalRef | DeleteWeakGlobalRef )
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- I . 弱全局引用
- II . 弱全局引用判定是否被回收
- III . 弱全局引用 創建 與 刪除 ( NewWeakGlobalRef | DeleteWeakGlobalRef )
- IV . 弱全局引用代碼示例
I . 弱全局引用
若全局引用 特點 : 弱全局引用 最大的特點是 可以被 JVM 自動回收 ;
弱全局引用 作用域 :
① 空間 : 都可以 跨方法 , 跨線程使用
② 時間 : 創建弱全局引用后可以開始使用 , JVM 自動回收 或 手動釋放 該弱全局引用不可用 ;
弱全局引用 與 全局引用 區別 :
① 全局引用 : 不能被 回收 , 如果內存不足就 拋出異常
② 弱全局引用 : 當內存不足時 , 會被系統自動回收
II . 弱全局引用判定是否被回收
弱全局引用 判定是否被回收 :
使用 IsSameObject(弱引用變量 , NULL) 判斷該對象是否被回收了 , 將其與 NULL 比較 , 即可判定該若全局引用是否被 JVM 回收 ;
① 返回 true ( 該對象與NULL相等 ) : 該若全局引用已經被釋放 ;
② 返回 false ( 該對象與NULL不相等 ) : 該弱全局引用還可以使用 ;
III . 弱全局引用 創建 與 刪除 ( NewWeakGlobalRef | DeleteWeakGlobalRef )
函數原型 :
struct _JNIEnv {/* _JNIEnv 結構體中封裝了 JNINativeInterface 結構體指針 */const struct JNINativeInterface* functions;...// 最終 調用的 還是 JNINativeInterface 結構體中封裝的 NewWeakGlobalRef 方法jweak NewWeakGlobalRef(jobject obj){ return functions->NewWeakGlobalRef(this, obj); }// 最終 調用的 還是 JNINativeInterface 結構體中封裝的 DeleteWeakGlobalRef 方法void DeleteWeakGlobalRef(jweak obj){ functions->DeleteWeakGlobalRef(this, obj); }... }① NewWeakGlobalRef : 傳入局部變量作為參數 , 創建弱全局引用 ;
② DeleteWeakGlobalRef : 釋放弱全局引用 ;
IV . 弱全局引用代碼示例
// 弱全局引用 // 訪問時如果局部變量也有同名變量 , 可以使用 域作用符 訪問 // ::class_teacher_weak_global 表示訪問全局的變量 jclass class_teacher_weak_global;extern "C" JNIEXPORT void JNICALL Java_kim_hsl_jni_MainActivity_jniWeakGlobalReferenceTest(JNIEnv *env, jobject instance) {/*弱全局引用弱全局引用 與 Java 引用類似弱全局引用 作用域 :空間 : 都可以 跨方法 , 跨線程使用時間 : 創建弱全局引用后可以開始使用 , JVM 自動回收 或 手動釋放 該弱全局引用不可用弱全局引用 與 全局引用 區別 :全局引用 : 不能被 回收 , 如果內存不足就 拋出異常弱全局引用 : 當內存不足時 , 會被系統自動回收弱全局引用 判定是否被回收 :使用 IsSameObject(弱引用變量 , NULL) 判斷該對象是否被回收了 , 將其與 NULL 比較 , 即可判定返回 true ( 該對象與NULL相等 ) : 該若全局引用已經被釋放返回 false ( 該對象與NULL不相等 ) : 還可以使用*/// 1 . 獲取 Teacher 類 ( 該變量需要釋放 )//如果 class_teacher_weak_global 對象被回收 , 返回 true ; 沒有被回收返回 false ;jboolean isClassReleased = env->IsSameObject(class_teacher_weak_global, NULL);if( class_teacher_weak_global == NULL || isClassReleased ) {//生成局部引用 , 該局部引用使用完畢后可釋放jclass tmp_class = env->FindClass("kim/hsl/jni/Teacher");//將上述生成的局部引用變成弱全局引用// 弱全局引用釋放時 , env->DeleteWeakGlobalRef(class_teacher_weak_global) 即可釋放下面轉換的弱全局引用class_teacher_weak_global = static_cast<jclass>(env->NewWeakGlobalRef(tmp_class));//將局部引用釋放掉env->DeleteLocalRef(tmp_class);}}
總結
以上是生活随笔為你收集整理的【Android NDK 开发】JNI 引用 ( 弱全局引用 | NewWeakGlobalRef | DeleteWeakGlobalRef )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android NDK 开发】JNI
- 下一篇: 【Android 应用开发】多点触控 (