Tre*_*ard 6 java jvm bytebuffer
或者我必须有一个调用env-> NewDirectByteBuffer(缓冲区,大小)的JNI辅助函数?
Pet*_*rey 15
我所做的是创建一个普通的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);
Run Code Online (Sandbox Code Playgroud)
从这一点开始,您可以访问引用底层地址的ByteBuffer.我已经这样做了访问网络适配器上的内存零拷贝,它工作正常.
您可以直接为您的地址创建一个DirectByteBuffer,但这更加模糊.
另一种方法是使用Unsafe(这仅适用于OpenJDK/HotSpot JVM和本机字节顺序)
Unsafe.getByte(address);
Unsafe.getShort(address);
Unsafe.getInt(address);
Unsafe.getLong(address);
Run Code Online (Sandbox Code Playgroud)