dat*_*ler 2 c++ java java-native-interface
我必须将c ++代码与java混合使用。java部分分配一个java.nio.ByteBuffer,而c ++部分通过env-> GetDirectBufferAddress(buffer)获取它的地址为jbyte *并填充数据。
ByteOrder可以。可以通过buffer.get().getLong()等在Java中检索数据。
但是,方法buffer.array()失败,并且hasArray()返回false。如果我使用buffer.allocate(size)而不是.allocateDirect(size),则array()方法效果很好,但是我的C ++代码获取的DirectDirectAddress为NULL并失败。
我的问题是:如何最好地结合两个世界,同时减少数据复制?或者,如何用本机c ++数据最简单地填充java byte []?
ByteBuffer类确实令人困惑。实际上,它是两个完全不同的类之一的包装器:DirectByteBuffer和ArrayByteBuffer。为什么会这样,这是历史学家们的一个问题。
就程序员而言,我们必须使用DirectByteBuffer来实现从C最快的无副本访问,但是从Java访问DirectByteBuffer可能很慢,并且缺少byte []的灵活性。基于数组的ByteBuffer对于C库没有优势,但在Java方面可能更高效。
另一方面,JNI确实提供对原始数组(包括byte [])的访问。在许多情况下,此类访问不涉及复制,尤其是在使用时GetPrimitiveArrayCritical()。好吧,没有保证。但是,如果您在具有大量物理RAM和几乎无限虚拟RAM的现代硬件上使用经过现代优化的JVM,则从C / C ++和Java进行有效访问的机会非常高。
| 归档时间: |
|
| 查看次数: |
2109 次 |
| 最近记录: |