我有一个Android项目(针对Android 1.6及更高版本),其中包含用C / C ++编写的本机代码,可通过NDK访问。我想知道最有效的方法是将Java中的字节数组通过NDK传递给我的JNI粘合层。我关心的是NDK for Android是否会复制字节数组,或者只是给我一个直接引用。我需要对C ++级别的字节进行只读访问,因此从我的角度来看,任何幕后复制都会浪费时间。
很容易在网上找到关于此的信息,但我不确定最相关的信息是什么。例子:
Get the pointer of a Java ByteBuffer though JNI
http://www.milk.com/kodebase/dalvik-docs-mirror/docs/jni-tips.html
http://elliotth.blogspot.com/2007/03/optimizing-jni-array-access.html
所以有人知道在当前的NDK中做到这一点的最佳(最有效,最少复制)方式是什么? GetByteArrayRegion? GetByteArrayElements?还有别的吗?
答案 0 :(得分:5)
根据文档,GetDirectBufferAddress
将为您提供参考而无需复制数组。
但是,要调用此函数,您需要使用ByteBuffer.allocateDirect()而不是简单的字节数组分配direct buffer。它有一个对应的explained here:
可以通过调用allocateDirect来创建直接字节缓冲区 这类工厂的方法。此方法返回的缓冲区 通常比分配和解除分配成本更高 非直接缓冲区。直接缓冲区的内容可能位于外部 正常的垃圾收集堆,以及它们对垃圾的影响 应用程序的内存占用可能不明显。它是 因此建议主要为主要分配直接缓冲区 大型,长期存在的缓冲区,受底层系统的影响 本机I / O操作。一般来说,最好直接分配 仅当它们在程序中产生可测量的增益时才缓冲 性能