Dalvik JNI 什么时候开始支持固定的?

When did the Dalvik JNI start supporting pinning?

Android NDK 出现在 support pinning down Java objects accessed from native code 使用 GetByteArrayElements 和朋友。但这种情况持续了多久?换句话说,我的应用程序是否也会尽可能避免在旧设备上进行复制?

查看源代码,JNI 库在 code added in 2009 (so Android 2.1, API level 7). Before that 中明确提到固定,看起来没有压缩垃圾收集器,所以固定不是问题,但库维护反正 "global references" 列表。

看来你很安全!

Dalvik 从来没有移动对象的 GC。我们做了必要的准备工作,例如明确固定对象,但在复制收集器的开发变得越来越认真的时候(2011 年年中),所有的开发工作都转移到了 Art。

"global references" 列表包含所有 JNI 全局引用。在早期,VM 分发原始指针,因此需要固定 JNI 可见的任何引用,这意味着本地或全局 JNI 引用引用的所有对象都是不可移动的。在 ICS(?) 版本中,Dalvik 的 JNI 切换到间接引用,这意味着我们只需要锁定为直接访问而显式固定的原语数组。 (如果您从链接到的更改返回日志中的一些提交,您可以看到一些 work in progress。)

间接引用代码几年没有推出,因为 Android 框架核心深处的一些代码假定 JNI 引用是唯一不变的值。 copying-collector 工作还没有开始,间接引用会导致轻微的性能损失,所以没有太多动力去搞乱平台的内部结构。