我已阅读有关 GetByteArrayElements 的链接:
常见问题解答:如何与 native 代码共享原始数据?
http://developer.android.com/training/articles/perf-jni.html
它表示 GetByteArrayElements 将返回指向 Dalvik 堆中原始数据的实际指针。所以我可以在 C++ 中操作原始源代码并加快进程,对吗?
那么,ReleaseByteArrayElements 也不会复制数据吗?或者因为 GetByteArrayElements 返回一个指针,我什至不需要在操作数据后释放它,就像对 FloatBuffer 使用 GetDirectBufferAddress 一样?
如果不需要将任何数据从 Java 复制到 C++,是否可以通过 GetByteArrayElements 传入和操作 float 组?请在 NDK: Passing Jfloat array from Java to C++ via GetByteArrayElements? 回答
Get<Primitive>ArrayElements
可能会或可能不会复制它认为合适的数据。 isCopy
输出参数将告诉您它是否已被复制。如果数据没有被复制,那么你已经获得了一个直接指向 Dalvik 堆中数据的指针。阅读更多 here .
你总是需要调用相应的Release<Primitive>ArrayElements
,无论是否制作了拷贝。将数据复制回 VM 数组并不是可能需要完成的唯一清理工作,尽管(根据已经链接的 JNI 文档)在 Release...
之前可以在 Java 端看到更改是可行的。已被调用(如果数据未被复制)。
我认为 VM 不会允许您进行必要的转换以实现您的想法。正如我所见,无论采用哪种方式,您都需要将字节数组转换为 float 或将 float 转换为 Java 中的字节数组,这是无法通过类型转换完成的。数据将在某个时候被复制。
编辑:
你想做的事可以使用 ByteBuffer.allocateDirect
实现, ByteBuffer.asFloatBuffer
, 和 GetDirectBufferAddress
.在 Java 中,您可以使用 FloatBuffer 将数据解释为 float ,并且可以使用 GetDirectBufferAddress
在 native 代码中直接使用数组。 .我发布了您的其他问题的答案作为进一步解释。