Android NDK学习笔记5:引用类型管理
生活随笔
收集整理的這篇文章主要介紹了
Android NDK学习笔记5:引用类型管理
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/zhaoyanjun6/article/details/119545225
本文出自【趙彥軍的博客】
文章目錄
- 局部引用
- 全局引用
- 弱引用
- 總結(jié)
在 JNI 中,有三種引用類型
- 全局引用
- 局部引用
- 弱引用
局部引用
在方法中定義的局部引用,可以不用手動(dòng)釋放,在程序運(yùn)行結(jié)束后,會自動(dòng)釋放。但是有一種情況,比如在方法中有 for 循環(huán),如果產(chǎn)生大量的局部引用,會占用大量內(nèi)存。所以一種比較好的編程習(xí)慣就是,產(chǎn)生的局部變量,一旦不再使用,就手動(dòng)釋放一下。
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é)束后不會自動(dòng)釋放內(nèi)存。
創(chuàng)建全局變量:
jobject NewGlobalRef(jobject obj)舉個(gè)例子:
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 不能修飾局部變量,因?yàn)榫植孔兞吭诔绦蛲顺龅臅r(shí)候,會自動(dòng)釋放。那么 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、全局引用可以做緩存,對象復(fù)用。可以避免頻繁的創(chuàng)建對象
- 2、弱引用會在內(nèi)存不足的情況下被回收,所以弱引用在使用之前要判斷是否為 Null
- 3、局部引用會在方法結(jié)束時(shí)自動(dòng)釋放,如果有循環(huán)頻繁創(chuàng)建局部引用,會占用大量內(nèi)存,需要手動(dòng)釋放
總結(jié)
以上是生活随笔為你收集整理的Android NDK学习笔记5:引用类型管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android NDK学习笔记4:JNI
- 下一篇: Android NDK学习笔记6:异常处