Android:将一些只读字节传递给本机C ++的最有效方法

时间:2011-12-15 23:46:34

标签: java android java-native-interface android-ndk

我有一个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?还有别的吗?

1 个答案:

答案 0 :(得分:5)

根据文档,GetDirectBufferAddress将为您提供参考而无需复制数组。

但是,要调用此函数,您需要使用ByteBuffer.allocateDirect()而不是简单的字节数组分配direct buffer。它有一个对应的explained here

  

可以通过调用allocateDirect来创建直接字节缓冲区   这类工厂的方法。此方法返回的缓冲区   通常比分配和解除分配成本更高   非直接缓冲区。直接缓冲区的内容可能位于外部   正常的垃圾收集堆,以及它们对垃圾的影响   应用程序的内存占用可能不明显。它是   因此建议主要为主要分配直接缓冲区   大型,长期存在的缓冲区,受底层系统的影响   本机I / O操作。一般来说,最好直接分配   仅当它们在程序中产生可测量的增益时才缓冲   性能