引用在Java编程中起到重要作用。这个虚拟机通过跟踪他们的引用来管理类实例的生命周期和垃圾管理机制收集不被引用的。因为本地代码不是一个管理的环境,这JNI提供了一套函数来运行本地的代码,明确的管理类的引用和生命周期。这JNI支持三张类型的引用:局部引用,全局引用和弱引用。

局部引用

局部引用不能被缓存和重复使用在一系列的调用因为他们的生命周期被限制在本地的方法。本地引用被释放一旦本地的方法返回。例如,这个FindClass函数返回一个弱引用;当本地方法返回时,自动释放掉。也可以明确的释放通过DelteLocalRef函数来释放。

jclass clazz;
  clazz = (*env)->FindClass(env, "java/lang/String");

新建全局引用

全局引用通过NewGLobalRef函数用本地引用来初始化。

jclass localClazz;
   jclass globalClazz;
  ...
  localClazz = (*env)->FindClass(env, "java/lang/String");
  globalClazz = (*env)->NewGlobalRef(env, localClazz);
  ...
  (*env)->DeleteLocalRef(env, localClazz);

删除全局引用

当全局引用不在需要时,调用DeleteGlobalRef删除全局引用。

(*env)->DeleteGlobalRef(env, globalClazz);

弱全局引用

像全局引用一样,接下来的本地方法的调用仍旧是有效的。不像全局引用那些,弱全局引用强调的对象(underlying object)可以被回收。

新建弱全局引用

jclass weakGlobalClazz;
  weakGlobalClazz = (*env)->NewWeakGlobalRef(env, localClazz);

验证一个弱全局引用

决定是否这个弱引用正在指向一个存活类的实例,你能够使用IsSameObject函数。

if (JNI_FALSE == (*env)->IsSameObject(env, weakGlobalClazz, NULL)) {
  /* Object is still live and can be used. */
  } else {
  /* Object is garbage collected and cannot be used. */
  }

删除弱引用

(*env)->DeleteWeakGlobalRef(env, weakGlobalClazz);

局部和全局引用的操作相关推荐

  1. 不能返回函数内部new分配的内存的引用_JNI开发之局部引用、全局引用和弱全局引用(三)...

    阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 这篇文章比较偏理论,详细介绍了在编写本地代码时三种引用的使用场景 ...

  2. java如何做全局缓存_传智播客JNI第七讲 – JNI中的全局引用/局部引用/弱全局引用、缓存jfieldID和jmethodID的两种方式...

    讲解JNI中的全局引用/局部引用/弱全局引用.缓存jfieldID和jmethodID的两种方式,并编写两种缓存方式的示例代码. 1.从Java虚拟机创建的对象传到本地C/C++代码时会产生引用,根据 ...

  3. Android-JNI开发系列《五》局部引用全局引用全局弱引用缓存策略

    人间观察 好像什么都来得及,又好像什么都来不及. 本篇文章主要介绍在jni开发中常见的三种引用的使用方法和注意事项以及jni和java交互的缓存策略. 我们知道Java是一门纯面象对象的语言,除了基本 ...

  4. 【Android NDK 开发】JNI 引用 ( 弱全局引用 | NewWeakGlobalRef | DeleteWeakGlobalRef )

    文章目录 I . 弱全局引用 II . 弱全局引用判定是否被回收 III . 弱全局引用 创建 与 删除 ( NewWeakGlobalRef | DeleteWeakGlobalRef ) IV . ...

  5. 【Android NDK 开发】JNI 引用 ( 全局引用 | NewGlobalRef | DeleteGlobalRef )

    文章目录 I . 全局引用 II . 创建全局引用 ( NewGlobalRef ) III . 全局引用代码示例 I . 全局引用 1 . 全局引用作用域 : 与局部引用对比 : 全局引用与局部引用 ...

  6. 孪生神经网络_基于局部和全局孪生网络的鲁棒的人脸跟踪

    论文名称 Siamese local and global networks for robust face tracking 引用:Qi, Yuankai, et al. "Siamese ...

  7. spark 数据倾斜之两阶段聚合(局部聚合+全局聚合)

    两阶段聚合(局部聚合+全局聚合) 方案适用场景: 对RDD执行reduceByKey等聚合类shuffle算子或者在Spark SQL中使用group by语句进行分组聚合时,比较适用这种方案. 方案 ...

  8. 【读点论文】Focal Self-attention for Local-Global Interactions in Vision Transformers局部和全局注意力进行交互实现新SOTA

    Focal Self-attention for Local-Global Interactions in Vision Transformers Abstract 本文提出了一种焦点自注意力机制 F ...

  9. 解决:全局引用了低版本的avue,而有些功能却在后续版本才有的问题

    问题分析:全局引用了低版本的avue,而有些功能却在后续版本才有,我们直接用原生前端敲出来,似乎是可以的,但若遇到比较麻烦的效果,可能就得整个界面都得大调整.那么可能会直接想到直接升级全局版本不就行了 ...

最新文章

  1. [转]Erwin4.1.4与PowerDesign9.5
  2. 前端相关的一些小工具
  3. (初学者)安装hadoop集群注意事项
  4. BZOJ2388 : 旅行规划
  5. Java 原子类的操作 AtomicInteger
  6. 复合机 涂布机_涂布复合机适用的范围在那些地方?
  7. c# DataTable DataBinding 应用笔记
  8. cad插件制作教程_CAD电子签名制作教程
  9. Windows Server 2016-批量设置用户下次登陆须更改密码
  10. 洛谷——P1155 双栈排序
  11. Java 加密扩展(JCE)框架 之 Cipher 加密与解密
  12. C# DIRECTX INPUT 模拟 (鼠标玩FBA街机)
  13. 三维空间坐标的旋转算法详解_任意旋转角三维空间直角坐标转换的迭代算法
  14. Vue使用debugger
  15. 星际大战(飞机游戏系列)
  16. Codeforces 417D Cunning Gena(状压DP)
  17. 数字IC面试高频考点之跨时钟域信号处理
  18. TypeScript 简介
  19. OSPF的LSA类型 ——连载四ASBR汇总LSA
  20. VOC、COCO数据集类别

热门文章

  1. iOS之深入解析Runtime的objc_msgSend“慢速查找”底层原理
  2. 2020\Simulation_2\4.括号序列
  3. 1113:不与最大数相同的数字之和
  4. oracle里返回值吗,Oracle有返回值的存储过程 | 学步园
  5. python中的位置怎么看_如何知道项目在Python有序字典中的位置
  6. oracle 合并重复数据_三天三夜整理出来的数据库常见的面试题,让你直接拿走...
  7. Linux C 的风格
  8. 51nod 1103 N的倍数 思路:抽屉原理+前缀和
  9. caffe训练输入数据格式介绍(LMDB/imagelist)
  10. sqlite3数据库操作小记