java - NDK : Does GetByteArrayElements copy data from Java to C++?

标签 java android c++ c android-ndk

<分区>

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

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

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

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

最佳答案

  1. Get<Primitive>ArrayElements可能会或可能不会复制它认为合适的数据。 isCopy输出参数将告诉您它是否已被复制。如果数据没有被复制,那么你已经获得了一个直接指向 Dalvik 堆中数据的指针。阅读更多 here .

  2. 你总是需要调用相应的Release<Primitive>ArrayElements ,无论是否制作了拷贝。将数据复制回 VM 数组并不是可能需要完成的唯一清理工作,尽管(根据已经链接的 JNI 文档)在 Release... 之前可以在 Java 端看到更改是可行的。已被调用(如果数据未被复制)。

  3. 我认为 VM 不会允许您进行必要的转换以实现您的想法。正如我所见,无论采用哪种方式,您都需要将字节数组转换为 float 或将 float 转换为 Java 中的字节数组,这是无法通过类型转换完成的。数据将在某个时候被复制。

编辑:

你想做的事可以使用 ByteBuffer.allocateDirect 实现, ByteBuffer.asFloatBuffer , 和 GetDirectBufferAddress .在 Java 中,您可以使用 FloatBuffer 将数据解释为 float ,并且可以使用 GetDirectBufferAddress 在 native 代码中直接使用数组。 .我发布了您的其他问题的答案作为进一步解释。

关于java - NDK : Does GetByteArrayElements copy data from Java to C++?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21691356/

相关文章:

java - Android 项目在 ListView 上滑动

java - 如何从消息数组中删除项目

android - 我必须点击后退按钮两次才能返回到上一个 Activity

java - 在自定义 View 类中访问 FragmentManager

c++ - 重载 operator new/分配超过对象大小

java - 无法弄清楚节点在我的代码中如何工作

Java ImageIO.write() 在保存期间更改质量

java - 如何将 Scribe 与尚未实现的 Api 一起使用?

c++ - 为什么我可以静态调用实例函数?

c++ - 从 .lib 到另一个 .lib 的依赖