文档章节

Android NDK对象的引用-全局引用,局部引用,弱引用

IamOkay
 IamOkay
发布于 2015/01/12 23:55
字数 462
阅读 609
收藏 0

百度了一下,google了一下,关于NDK引用的介绍无10篇中就有9.9篇是相同的,对于这种问题,我只能呜呼哀哉了!!


局部引用(函数内部对象类型变量):在C或C++中,局部变量表示只运行范围局限在该变量最近的 “{}”花括号里,常见的就是函数中的变量了,但局部引用和局部变量不同了,引用的主体是对象,指针,

因此,设涉及到内存回收问题。同局部变量一样,局部对象在函数执行完成后会被立即销毁。

(错误的用法1:将局部引用赋值给全局引用或弱引用)

 (错误的用法 : 引用被静态缓存,这种方法十分危险,容易导致程序蹦退,但不是不可以,只是引用的主题必须不是对象才行,比如jfieldID,jmethodID等)

JNIEXPORT void JNICALL Java_com_ndk_cjava_exchange_UserEntity_referenceUnit
  (JNIEnv * env, jobject thiz)
  {
    static jfieldID nameField = NULL;
    if(nameField==NULL)
    {
	nameField =  env->GetFieldID(clazz,"name","Ljava/lang/String;");
    }
	//do somthing
}


全局引用(函数外部对象类型变量):全局引用表示把局部引用通过某种方式复制给全局对象,并且该变量不会自动销毁,需要手动销毁

jclass globalJclazz = NULL;
JNIEXPORT void JNICALL Java_com_ndk_cjava_exchange_UserEntity_referenceUnit
  (JNIEnv * env, jobject thiz)
{
	if(globalJclazz==NULL)
	{
		__android_log_print(ANDROID_LOG_INFO,"REF","--1-->");
		globalJclazz = (jclass)(env->NewGlobalRef(env->GetObjectClass(thiz))); //转为全局引用
	}else{
		__android_log_print(ANDROID_LOG_INFO,"REF","--2-->");
		env->DeleteGlobalRef(globalJclazz);
		globalJclazz =NULL;
	}
}


弱引用:作用域同全局变量一样,但不能保证该引用一致从在,当内存不足时会自动销毁

jclass weakclass = NULL;

JNIEXPORT void JNICALL Java_com_ndk_cjava_exchange_UserEntity_referenceUnit
  (JNIEnv * env, jobject thiz)
{
	if(weakclass==NULL || (env->IsSameObject(weakclass,NULL))==JNI_TRUE)
	{
		jclass jclzz  = env->GetObjectClass(thiz);
		weakclass = (jclass)(env->NewWeakGlobalRef(jclzz));
	}else{
		env->DeleteWeakGlobalRef(weakclass);
		weakclass = NULL;
	}
}



© 著作权归作者所有

IamOkay

IamOkay

粉丝 204
博文 483
码字总数 403228
作品 0
海淀
程序员
私信 提问
Android JNI(一)——NDK与JNI基础

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法...

隔壁老李头
2018/05/09
0
0
Android NDK开发(六):JNI引用

前言 说到引用,对于一个Android开发工程师来说,肯定不会陌生,下面我们将介绍JNI中的引用。 引用类型 JNI中的引用分为局部引用和全局引用(包含弱全局引用) 引用的作用 在JNI中告知虚拟机...

浮生若梦zp
2017/11/14
0
0
NDK开发——JNI必须掌握的常用例子

前言 要学习NDK之前,我们得先在AndroidStudio中学习JNI,还有C和C++基础,这些都是接触NDK的前提,那么废话不多说,开始吧 对于NDK在AndroidStudio的配置,可以关注我的博客找到相关文章,本...

qq_30379689
2017/09/01
0
0
Android JNI开发系列(十二) JNI局部引用、全局引用和弱全局引用

JNI 局部引用、全局引用和弱全局引用 在JNI规范中定义了三种引用:局部引用(Local Reference)、全局引用(Global Reference)、弱全局引用(Weak Global Reference)。区别如下: 局部引用...

蔡小鹏
2018/10/18
548
0
Android内存泄漏检测LeakCanary,原理分析,解决方案

> LeakCanary使用及内存检测 LeakCanary使用教程- https://blog.csdn.net/feather_wch/article/details/79223776 LeakCanary的一个小Demo- https://github.com/NewBrandSTONE/MyLeakActivity......

desaco
01/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx+tomcat配置https

1、nginx配置https和【proxy_set_header X-Forwarded-Proto $scheme;】 2、java代码: String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServe......

perofu
13分钟前
3
0
必看的Linux系统新手进阶老手心得

不知道从什么时候起,linux这个话题变得越来越普及,成为大家经常讨论的话题。无论在网络上还是实际生活中,竟然很多人都在纠结学习linux的问题。网络上给的答案千千万万,而却还有很多人踌躇...

Linux就该这么学
16分钟前
3
0
Spring Boot 配置元数据指南

1. 概览 在编写 Spring Boot 应用程序时,将配置属性映射到 Java bean 上是非常有用的。但是,记录这些属性的最好方法是什么呢? 在本教程中,我们将探讨 Spring Boot Configuration Proces...

liululee
19分钟前
2
0
foreach查找子类

$list = $menu_model -> menu_list();$parent_list = [];foreach ($list as $v){ if ($v['pid'] == 0) { $parent = $v; foreach ($list as $v1) ......

小小小壮
31分钟前
2
0
基于 HTML5 Canvas 实现的 TP-LINK 电信拓扑设备面板

前言 今天我们以真实的 TP-LINK 设备面板为模型,完成设备面板的搭建,和指示灯的闪烁和图元流动。 先来目睹下最终的实现效果:http://www.hightopo.com/demo/blog_tplink_20170511/index.h...

htdaydayup
37分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部