从C/C+;在内存中写入缓冲区+;并在没有JNI的情况下用java阅读

从C/C+;在内存中写入缓冲区+;并在没有JNI的情况下用java阅读,java,c++,java-native-interface,buffer,Java,C++,Java Native Interface,Buffer,我有一个问题,这可能吗?怎么可能?从使用Java从C/C++创建的内存中的缓冲区读取字节?我的想法是使用JNI启动一个C++循环,在缓冲区中写入字节,只将缓冲区的方向发送给java,然后java从另一个周期读取字节。目标是减少JNI函数的调用,因为我注意到它们会降低性能。我想知道我必须用java中的哪些类,以及C++中的哪些函数? 事先非常感谢您您可以使用ByteBuffer。最简单的方法是使用Java分配的地址使用ByteBuffer.allocateDirect()。如果您必须使用C提供的地

我有一个问题,这可能吗?怎么可能?从使用Java从C/C++创建的内存中的缓冲区读取字节?我的想法是使用JNI启动一个C++循环,在缓冲区中写入字节,只将缓冲区的方向发送给java,然后java从另一个周期读取字节。目标是减少JNI函数的调用,因为我注意到它们会降低性能。我想知道我必须用java中的哪些类,以及C++中的哪些函数?
事先非常感谢您

您可以使用ByteBuffer。最简单的方法是使用Java分配的地址使用
ByteBuffer.allocateDirect()
。如果您必须使用C提供的地址,您可以更改地址和限制(大小)以指向您喜欢的任何地方


如果您希望使用更低级的方法,那么在Oracle JVM上可以使用
Unsafe.getXxxx(长地址)
Unsafe.setXxxx(长地址,T值)
方法,但必须小心使用,因为不正确的使用会使JVM崩溃。(就像在C中使用无效指针一样)ByteBuffer使用这些方法,并将其转换为一条经过优化的机器代码指令。

然后我可以使用java在内存中分配地址,并在C中使用它在该缓冲区中写入?谢谢你能回答我的问题。这是最安全的方法。您可能希望将字节顺序设置为默认的big-endian(但在x86/x64上,它的C小endian)使用
ByteBuffer.order(ByteOrder.nativeOrder())
,在任何平台上都是正确的。