我已经阅读了有关GetByteArrayElements的链接: 常见问题:如何与本机代码共享原始数据? http://developer.android.com/training/articles/perf-jni.html
它说GetByteArrayElements将返回Dalvik堆中原始数据的实际指针。所以我可以在C ++中操作原始源并加快进程,我是对的吗?
所以,ReleaseByteArrayElements也不会复制数据?或者因为GetByteArrayElements返回一个指针,我甚至不需要在操作数据之后释放它,就像使用FloatBuffer的GetDirectBufferAddress一样?
如果不必将任何数据从Java复制到C ++,是否可以通过GetByteArrayElements传入和操作float数组? Plz在NDK: Passing Jfloat array from Java to C++ via GetByteArrayElements?
答案 0 :(得分:10)
Get<Primitive>ArrayElements
可能会也可能不会根据需要复制数据。 isCopy
输出参数将告诉您它是否已被复制。如果未复制数据,则直接在Dalvik堆中获取指向数据的指针。阅读更多here。
无论是否制作副本,您始终需要调用相应的Release<Primitive>ArrayElements
。将数据复制回VM阵列并不是唯一可能需要完成的清理工作,尽管(根据已经链接的JNI文档),在Release...
之前可以在Java端看到更改是可行的。调用(iff数据尚未复制)。
我不相信VM会允许您进行必要的转换来完成您的想法。正如我所看到的,无论你走到哪里,你都需要将一个字节数组转换为浮点数或浮点数转换为Java中的字节数组,这是通过类型转换无法实现的。数据将在某些时候被复制。
编辑:
使用ByteBuffer.allocateDirect
,ByteBuffer.asFloatBuffer
和GetDirectBufferAddress
可以实现您想要做的事情。在Java中,您可以使用FloatBuffer将数据解释为浮点数,并且可以使用GetDirectBufferAddress
直接在本机代码中使用该数组。我在你的另一个问题上找到了答案,作为进一步的解释。