java.nio.DirectByteBuffer
做你想做的事。
在内部,它使用 aprivate long address
来存储指针值。呸!
使用 JNI 函数env->NewDirectByteBuffer((void*) data, sizeof(MyNativeStruct))
在 C/C++ 端创建 DirectByteBuffer,并将其作为 ByteBuffer 返回到 Java 端。注意:在本机端释放这些数据是你的工作!它错过了标准 DirectBuffer 上可用的自动清洁器。
在 Java 端,您可以通过这种方式创建 DirectByteBuffer:
ByteBuffer directBuff = ByteBuffer.allocateDirect(sizeInBytes);
认为它是一种 C 的 malloc(sizeInBytes)
。注意:它具有自动清理程序,可释放先前请求的内存。
但是使用 DirectByteBuffer 有几点需要考虑:
- 如果您错过了直接的 ByteBuffer 引用,它可能会被垃圾收集 (GC)。
- 您可以读取/写入指向结构的值,但要注意偏移量和数据大小。编译器可能会为填充添加额外的空间并破坏您假定的结构内部偏移量。带有指针的结构(步幅是 4 还是 8 字节?)也会让您的数据感到困惑。
- Direct ByteBuffers 很容易作为本地方法的参数传递,也很容易将其作为返回值返回。
- 您必须在 JNI 端强制转换为正确的指针类型。返回的默认类型
env->GetDirectBufferAddress(buffer)
是void*
。
- 一旦创建,您将无法更改指针值。
- 您的工作是释放先前分配给本机缓冲区的内存。你用的那些
env->NewDirectByteBuffer()
。