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

occ*_*lus 5 java java-native-interface android android-ndk

我有一个Android项目(针对Android 1.6及更高版本),其中包含用C/C++编写的本机代码,可通过NDK访问.我想知道最有效的方法是将Java中的字节数组通过NDK传递给我的JNI粘合层.我关心的是NDK for Android是否会复制字节数组,或者只是给我一个直接引用.我需要对C++级别的字节进行只读访问,因此从我的角度来看,任何幕后复制都是浪费时间.

在网上很容易找到相关信息,但我不确定最相关的信息是什么.例子:

通过JNI获取Java ByteBuffer的指针

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?别的什么?

Dal*_*mas 5

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

但是,要调用此函数,您需要使用ByteBuffer.allocateDirect()而不是简单的字节数组分配直接缓冲区.它有一个对应的解释如下:

可以通过调用此类的allocateDirect工厂方法来创建直接字节缓冲区.与非直接缓冲区相比,此方法返回的缓冲区通常具有更高的分配和解除分配成本.直接缓冲区的内容可能位于正常的垃圾收集堆之外,因此它们对应用程序的内存占用量的影响可能并不明显.因此,建议直接缓冲区主要分配给受基础系统本机I/O操作影响的大型长期缓冲区.通常,最好只在它们在程序性能上产生可测量的增益时才分配直接缓冲区.