日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android NDK学习笔记5:引用类型管理

發(fā)布時間:2024/9/30 Android 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android NDK学习笔记5:引用类型管理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)載請標明出處:http://blog.csdn.net/zhaoyanjun6/article/details/119545225
本文出自【趙彥軍的博客】

文章目錄

  • 局部引用
  • 全局引用
  • 弱引用
  • 總結(jié)

在 JNI 中,有三種引用類型

  • 全局引用
  • 局部引用
  • 弱引用

局部引用

在方法中定義的局部引用,可以不用手動釋放,在程序運行結(jié)束后,會自動釋放。但是有一種情況,比如在方法中有 for 循環(huán),如果產(chǎn)生大量的局部引用,會占用大量內(nèi)存。所以一種比較好的編程習慣就是,產(chǎn)生的局部變量,一旦不再使用,就手動釋放一下。

void DeleteLocalRef(jobject localRef)

舉例說明:

extern "C" JNIEXPORT void JNICALL Java_com_example_myapplication_MainActivity_run(JNIEnv *env, jobject thiz) {jstring str = env->NewStringUTF("string");//釋放局部變量env->DeleteLocalRef(str); }

全局引用

顧名思義,全局引用就是生命周期特別長,方法結(jié)束后不會自動釋放內(nèi)存。

創(chuàng)建全局變量:

jobject NewGlobalRef(jobject obj)

舉個例子:

extern "C" JNIEXPORT void JNICALL Java_com_example_myapplication_MainActivity_run(JNIEnv *env, jobject thiz) {static jclass strClass = nullptr;if (strClass == nullptr) {//創(chuàng)建局部變量jclass cls = env->FindClass("java/lang/String");//全局引用賦值strClass = static_cast<jclass>(env->NewGlobalRef(cls));//釋放局部引用env->DeleteLocalRef(cls);} else {//使用全局變量} }

需要注意的是 ,static 不能修飾局部變量,因為局部變量在程序退出的時候,會自動釋放。那么 static 修飾的變量就變成了野指針。

釋放全局引用

void DeleteGlobalRef(jobject globalRef)

舉例說明:

extern "C" JNIEXPORT void JNICALL Java_com_example_myapplication_MainActivity_run(JNIEnv *env, jobject thiz) {static jclass strClass = nullptr;if (strClass == nullptr) {//創(chuàng)建局部變量jclass cls = env->FindClass("java/lang/String");//全局引用賦值strClass = static_cast<jclass>(env->NewGlobalRef(cls));//釋放局部引用env->DeleteLocalRef(cls);} else {//使用全局變量}//釋放全局引用env->DeleteGlobalRef(strClass); }

弱引用

弱引用的定義和java 弱引用的定義是一樣的。
全局引用不會被 GC , 但是弱引用會在內(nèi)存不足的情況下,被GC。所以在使用 弱引用之前要判斷一下該引用是否被GC 。

判斷方法:

jboolean IsSameObject(jobject ref1, jobject ref2)

舉例說明:

extern "C" JNIEXPORT void JNICALL Java_com_example_myapplication_MainActivity_run(JNIEnv *env, jobject thiz) {static jclass strClass = nullptr;if (strClass == nullptr) {//創(chuàng)建局部變量jclass cls = env->FindClass("java/lang/String");//弱引用賦值strClass = static_cast<jclass>(env->NewWeakGlobalRef(cls));//釋放局部引用env->DeleteLocalRef(cls);} else {}//判斷是否被GCbool isGC = env->IsSameObject(strClass, nullptr);if (isGC) {//弱引用被回收了} else {//弱引用沒有被回收}//釋放全局引用env->DeleteWeakGlobalRef(strClass); }

總結(jié)

  • 1、全局引用可以做緩存,對象復用。可以避免頻繁的創(chuàng)建對象
  • 2、弱引用會在內(nèi)存不足的情況下被回收,所以弱引用在使用之前要判斷是否為 Null
  • 3、局部引用會在方法結(jié)束時自動釋放,如果有循環(huán)頻繁創(chuàng)建局部引用,會占用大量內(nèi)存,需要手動釋放

總結(jié)

以上是生活随笔為你收集整理的Android NDK学习笔记5:引用类型管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。