Local Reference的生命周期

简单来说,FindClass、NewObject方法都会返回一个local reference的jobject。按照很多官方、半官方的文档说明,local reference被释放的时机大概有这么几种说法:

  1. 当前函数退出。简单理解来说就是调用FindClass或者NewObject的函数栈退出。
  2. 脱离当前native上下文,从Native回到了Java。简单理解来说就是调用FindClass或者NewObject之后,又再次调用了一个JNI接口。
  3. 当前thread从JVM里detach的时候。

分析下来:

  1. 想想就觉得非常离谱,如果是这样的话那几乎就不可用了
  2. 感觉也挺荒谬的,不好控制
  3. 实测的结论是3,调用了DetachCurrentThread之后。

测试方法:

不断在各个点打印GetObjectRefType的结果,看看是1还是0。发现DetachCurrentThread后立刻从1变成0了。但是一个奇怪的点是:调用DeleteLocalRef之后居然不会从1变成0,原因暂时未知。

结论:

DetachCurrentThread的时候local reference失效。这个结论是不是绝对正确的,还不好说。

参考文献:

https://www.cnblogs.com/fnlingnzb-learner/p/7372189.html

Android JNI 中的引用管理-腾讯云开发者社区-腾讯云

IBM Documentation

https://www.cnblogs.com/porter/p/9399716.html

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值