Dalvik JNI何时开始支持钉扎?

时间:2015-06-11 09:55:40

标签: java android java-native-interface dalvik

Android NDK使用GetByteArrayElements和朋友support pinning down Java objects accessed from native code显示。但这种情况有多长?换句话说,我的应用程序是否会在旧设备上尽可能避免复制?

2 个答案:

答案 0 :(得分:1)

纵观源代码,JNI库在2009年明确提到了code added中的固定(因此Android 2.1,API级别7)。 Before that,看起来没有压缩的垃圾收集器,所以固定不是问题,但是库仍然保留了一个“全局引用”列表。

所以看起来你很安全!

答案 1 :(得分:1)

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

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

由于Android框架核心中的一些代码假定JNI引用是唯一不变的值,因此间接引用代码没有推出几年。复制 - 收集器的工作还没有开始,间接引用会导致轻微的性能损失,因此没有太多的动机来搞乱平台的内容。