NDK:GetByteArrayElements是否将数据从Java复制到C ++?

时间:2014-02-11 01:32:24

标签: java android c++ c android-ndk

我已经阅读了有关GetByteArrayElements的链接: 常见问题:如何与本机代码共享原始数据? http://developer.android.com/training/articles/perf-jni.html

  1. 它说GetByteArrayElements将返回Dalvik堆中原始数据的实际指针。所以我可以在C ++中操作原始源并加快进程,我是对的吗?

  2. 所以,ReleaseByteArrayElements也不会复制数据?或者因为GetByteArrayElements返回一个指针,我甚至不需要在操作数据之后释放它,就像使用FloatBuffer的GetDirectBufferAddress一样?

  3. 如果不必将任何数据从Java复制到C ++,是否可以通过GetByteArrayElements传入和操作float数组? Plz在NDK: Passing Jfloat array from Java to C++ via GetByteArrayElements?

  4. 回答

1 个答案:

答案 0 :(得分:10)

  1. Get<Primitive>ArrayElements可能会也可能不会根据需要复制数据。 isCopy输出参数将告诉您它是否已被复制。如果未复制数据,则直接在Dalvik堆中获取指向数据的指针。阅读更多here

  2. 无论是否制作副本,您始终需要调用相应的Release<Primitive>ArrayElements。将数据复制回VM阵列并不是唯一可能需要完成的清理工作,尽管(根据已经链接的JNI文档),在Release...之前可以在Java端看到更改是可行的。调用(iff数据尚未复制)。

  3. 我不相信VM会允许您进行必要的转换来完成您的想法。正如我所看到的,无论你走到哪里,你都需要将一个字节数组转换为浮点数或浮点数转换为Java中的字节数组,这是通过类型转换无法实现的。数据将在某些时候被复制。

  4. 编辑:

    使用ByteBuffer.allocateDirectByteBuffer.asFloatBufferGetDirectBufferAddress可以实现您想要做的事情。在Java中,您可以使用FloatBuffer将数据解释为浮点数,并且可以使用GetDirectBufferAddress直接在本机代码中使用该数组。我在你的另一个问题上找到了答案,作为进一步的解释。