或者我必须有一个调用env-> NewDirectByteBuffer(buffer,size)的JNI助手函数吗?有没有一种方法可以仅通过Java中的指针创建直接的ByteBuffer?
回答
我所做的是创建一个正常的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,但这比较模糊。
另一种方法是(OpenJDK的/热点的JVM和本地字节顺序这只作品)使用不安全
Unsafe.getByte(address);
Unsafe.getShort(address);
Unsafe.getInt(address);
Unsafe.getLong(address);
很好的答案,但是我不得不对它进行一些操作,特别是Field address = Buffer.class.getDeclaredField(“address”)。 – Erik 2016-08-23 15:50:17
@Erik谢谢你的纠正。 – 2016-08-23 22:19:17
所以这里是对原始问题的跟进,因为你还在关注。以这种方式清理连接到ByteBuffer的内存的最佳方法是什么? ByteBuffer会完成免费地址还是应该调用者干预并清理分配?为了这个问题的目的,假设我已经写了一个带有malloc和免费的包装器的JNI库。现在我可能更应该考虑它自己的问题了。 – Erik 2016-08-23 22:23:58
- 1. 有没有一种方法可以仅通过url为关系建模?
- 2. 通过JNI获取Java ByteBuffer的指针
- 3. 有没有一种方法可以有一个桶指针? (C/C++)
- 4. 有没有一种方法可以通过网络访问R?
- 5. 有没有办法得到一个直接指向通过JNI的Java数组?
- 6. 有没有一种方法可以直接导航到Orbeon格式的部分?
- 7. 有没有一种方法可以在没有Java支持的Matlab上通过TCPIP进行通信
- 8. 有没有一种方法,以新的一类,它是同类型的其他类没有直接指定它
- 9. 有没有一种简单的方法可以在C++中创建最小堆?
- 10. 有没有一种方法,以创建具有在CSS
- 11. 有没有一种方法可以使用java中的循环创建可变数量的数组?
- 12. 在TFS中,有没有一种方法可以创建查询来仅显示某个结果的测试?
- 13. 有没有一种方法可以压缩Java Try Catch Blocks?
- 14. 有没有一种方法可以指定Gradle中新创建的源代码集的依赖关系?
- 15. 有没有一种方法可以在直播网站上使用drawWindow()方法?
- 16. 在.NET中有没有一种方法可以通过现有的XML文件以编程方式生成DTD?
- 17. 有没有一种方法可以从JavaScript Node接口继承?
- 18. 有没有一种方法可以区分JavaScript中的鼠标?
- 19. SQL - 有没有一种方法可以隐藏select中的列?
- 20. 有没有一种方法可以通过id获取ace编辑器?
- 21. Android TabHost有没有一种方法可以通过ID获得TabView
- 22. 有没有一种方法可以在没有os.chmod的* nix系统下使用Python创建可执行文件?
- 23. 在Java中,有没有一种方法可以通过语言环境获取带后缀的日期?
- 24. 有没有一种方法可以在iPhone SDK上创建覆盖视图?
- 25. 有没有一种方法可以动态地创建基于XSD文件
- 26. 有没有一种方法可以在创建类时自动调用函数
- 27. Java中有没有一种方法可以确定路径是否有效,而不尝试创建文件?
- 28. 在Javascript中,有没有一种方法可以统计我创建了多少个创建的对象?
- 29. 有没有一种方法可以在tcl的'=='测试中使用通配符?
- 30. 有没有一种方法可以覆盖GridControl中的DevExpress过滤器选项?
你看着sun.misc.unsafe?它允许你直接与内存交互。 – assylias 2013-05-09 15:42:18
我看了一下,没有看到用sun.misc.unsafe创建直接字节缓冲区的方法。我确实找到了一种创建DirectByteBuffer的方式,它是通过反射来实现的。使用java.lang.Class.getDeclaredConstructor创建一个Constructor对象,setAccessable为true并用适当的参数调用newInstance。虽然没有什么JNI代码,但是你不必写任何jijy代码。 – 2013-05-12 20:39:46