有没有办法只用Java在指针中创建一个直接的ByteBuffer?

或者我必须有一个调用env-> NewDirectByteBuffer(缓冲区,大小)的JNI辅助函数?

我所做的是创建一个普通的DirectByteBuffer并更改它的地址。

Field address = Buffer.class.getDeclaredField("address"); address.setAccessible(true); Field capacity = Buffer.class.getDeclaredField("capacity"); capacity.setAccessible(true); ByteBuffer bb = ByteBuffer.allocateDirect(0).order(ByteOrder.nativeOrder()); address.setLong(bb, addressYouWantToSet); capacity.setInt(bb, theSizeOf); 

从这一点开始,您可以访问引用底层地址的ByteBuffer。 我已经这样做了访问网络适配器上的内存零拷贝,它工作正常。

您可以直接为您的地址创建一个DirectByteBuffer,但这更加模糊。


另一种方法是使用Unsafe(这仅适用于OpenJDK / HotSpot JVM和本机字节顺序)

 Unsafe.getByte(address); Unsafe.getShort(address); Unsafe.getInt(address); Unsafe.getLong(address);