简单来说,FindClass、NewObject方法都会返回一个local reference的jobject。按照很多官方、半官方的文档说明,local reference被释放的时机大概有这么几种说法:
- 当前函数退出。简单理解来说就是调用FindClass或者NewObject的函数栈退出。
- 脱离当前native上下文,从Native回到了Java。简单理解来说就是调用FindClass或者NewObject之后,又再次调用了一个JNI接口。
- 当前thread从JVM里detach的时候。
分析下来:
- 想想就觉得非常离谱,如果是这样的话那几乎就不可用了
- 感觉也挺荒谬的,不好控制
- 实测的结论是3,调用了DetachCurrentThread之后。
测试方法:
不断在各个点打印GetObjectRefType的结果,看看是1还是0。发现DetachCurrentThread后立刻从1变成0了。但是一个奇怪的点是:调用DeleteLocalRef之后居然不会从1变成0,原因暂时未知。
结论:
DetachCurrentThread的时候local reference失效。这个结论是不是绝对正确的,还不好说。
参考文献:
https://www.cnblogs.com/fnlingnzb-learner/p/7372189.html