Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:将一些只读字节传递给本机C++;_Java_Android_Java Native Interface_Android Ndk - Fatal编程技术网

Java Android:将一些只读字节传递给本机C++;

Java Android:将一些只读字节传递给本机C++;,java,android,java-native-interface,android-ndk,Java,Android,Java Native Interface,Android Ndk,我有一个Android项目(目标是Android 1.6及以上版本),其中包括用C/C++编写的本地代码,通过NDK访问。我想知道最有效的方法是通过NDK将字节数组从Java传递到我的JNI粘合层。我关心的是NDK for Android是否会复制字节数组,或者只是给我一个直接的参考。我需要只读访问C++级别的字节,所以在我看来,任何复制幕后都是浪费时间。 在网上很容易找到这方面的信息,但我不确定什么是最相关的信息。示例: 那么,有人知道在当前的NDK中实现这一点的最佳(最有效、最少复制)

我有一个Android项目(目标是Android 1.6及以上版本),其中包括用C/C++编写的本地代码,通过NDK访问。我想知道最有效的方法是通过NDK将字节数组从Java传递到我的JNI粘合层。我关心的是NDK for Android是否会复制字节数组,或者只是给我一个直接的参考。我需要只读访问C++级别的字节,所以在我看来,任何复制幕后都是浪费时间。 在网上很容易找到这方面的信息,但我不确定什么是最相关的信息。示例:


那么,有人知道在当前的NDK中实现这一点的最佳(最有效、最少复制)方法是什么吗?GetByteArrayRegion?GetByteArrayements?还有什么?

根据文档,将在不复制阵列的情况下为您提供参考

但是,要调用此函数,您需要使用ByteBuffer.allocateDirect()而不是简单的字节数组来分配。其对应物如下:

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


有没有类似的高效API来做相反的事情将
无符号字符*
作为
byte[]
byteBuffer
从本机层传递到Java层?直接byteBuffer和byte[]都可用于从本机侧读/写。调用env->GetDirectBufferAddress(buffer)或env->GetArrayElements(array,…)后,可以使用C的memcopy函数读取/复制。但是直接ByteBuffer速度更快,不播放拷贝,更安全,等等