2011-10-25 39 views
4

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

提前非常感谢你

回答

3

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

如果您宁愿使用更低级别的东西,则可以在Oracle JVM上使用Unsafe.getXxxx(long address)Unsafe.setXxxx(long address, T value)方法,但这些方法必须小心使用,因为不正确的用法会导致JVM崩溃。 (就像在C中使用一个无效指针一样)这些方法被ByteBuffer使用,并转化为一个优化的机器代码指令。

+0

然后我可以使用java在内存中分配一个地址,并用它在C中写入该缓冲区?我感谢你的回答 –

+0

你可以。这是最安全的方法。您可能需要设置字节顺序为默认大字节(但在x86/x64上它的小字节在C中)使用'ByteBuffer.order(ByteOrder.nativeOrder())',它在任何平台上都是正确的。 –

+1

感谢兄弟是正确的做法。 –

相关问题