JNI GetDirectBufferAddress vs. ByteBuffer.array()
JNI GetDirectBufferAddress vs. ByteBuffer.array()
我必须将c ++代码与java混合在一起。java 部分分配一个 java.nio.ByteBuffer,c++ 部分通过 env->GetDirectBufferAddress(buffer) 作为 jbyte* 获取它的地址并填充数据。
字节顺序是可以的。数据可以通过buffer.get() .getLong()等在java中检索。
但是,方法buffer.array()失败,hasArray()返回false。如果我使用 buffer.allocate(size) 而不是 .allocateDirect(size),则方法array() 运行良好,但我的 c++ 代码获得 NULL 的 DirectBufferAddress 并失败。
我的问题:如何才能最好地结合这两个世界,同时减少数据复制?或者,如何最容易地用原生 c++ 数据填充 java 字节 []?
ByteBuffer 类确实令人困惑。它实际上是两个完全不同的类之一的包装器:DirectByteBuffer 和 ArrayByteBuffer。为什么会这样,是历史学家的问题。
就程序员而言,我们必须使用 DirectByteBuffer 来实现来自 C 的最快、无复制访问,但从 Java 访问 DirectByteBuffer 可能相当慢,并且缺乏 byte[] 的灵活性。基于数组的 ByteBuffer 对 C 库没有优势,但在 Java 端可能效率更高。
另一方面,JNI 确实提供了对基元数组的访问,包括 byte[]。在许多情况下,此类访问不涉及复制,尤其是在您使用 GetPrimitiveArrayCritical()
.好吧,没有保证。但是,如果您在具有丰富物理 RAM 和几乎无限虚拟 RAM 的现代硬件上使用现代优化的 JVM,那么您从 C/C++ 和 Java 进行高效访问的机会非常高。
- C++11 中不同类型的对象的 std::array 的替代方案
- constexpr begin of a std::array
- C++如果必须在编译时确定大小,std::array 有什么意义?
- OpenGL VBO Indexing ( How to compute Index Array)
- 标准::unordered_map 中的 std::array 的值初始化
- "Warning: Comma within array index expression"但逗号分隔函数参数
- 确保编译时的特定 std::array 位置
- std::array的长度有大小限制吗?
- 将 std::array 移动到另一个 std::array
- 首先按给定顺序打印所有数字,然后使用 Array 打印所有字符和其他符号
- 为什么 std::shared_ptr 被认为是"heavy"和"expensive",但 std::array "same perfprmance as plain (c-style) arrays
- 将 **float array 从 C++ Dll 传递给 python
- std::bind on statd::array 的运算符 []
- 检查输入 std::array 指针数据是否等于某个常量数组
- 我可以安全地复制矢量<array>吗?
- 解析问题 - 预期的非限定 ID - #include <array> 编译错误
- 如何读/写或遍历 std::array 中的特定元素范围?
- 通过 host() 从 af::array 检索数据会导致错误的数据
- 是否可以使用 std::array 作为 POD 结构的数据容器?
- JNI GetDirectBufferAddress vs. ByteBuffer.array()