还是我必须有一个调用 env->NewDirectByteBuffer(buffer, size) 的 JNI 辅助函数?
问问题
2839 次
1 回答
19
我所做的是创建一个普通的 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);
于 2013-05-12T20:46:12.463 回答