Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.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 从jni返回bytebuffer是副本还是引用?_Java_Android_Java Native Interface - Fatal编程技术网

Java 从jni返回bytebuffer是副本还是引用?

Java 从jni返回bytebuffer是副本还是引用?,java,android,java-native-interface,Java,Android,Java Native Interface,我将bytebuffer从jni返回到java层 getData(JNIENV, *env, jobject obj ) { pthread_mutex_lock(&mutexA); while(dataAvailable == 0){ pthread_cond_wait (&cond, &MutexA); } dataAvailable = 0; pthread_mutex_unlock(&

我将bytebuffer从jni返回到java层

    getData(JNIENV, *env, jobject obj ) {

    pthread_mutex_lock(&mutexA);


    while(dataAvailable == 0){
        pthread_cond_wait (&cond, &MutexA);
    }

    dataAvailable = 0;

    pthread_mutex_unlock(&MutexA);

    return jnv->NewDirectByteBuffer(DataPointer, dataSize);
}
来自Java:

  while (1) {
     ByteBuffer byteBuffer = getData();

  }

此byteBuffer是否引用到DataPointer,或者是否复制到java层中的“byteBuffer”变量?

它是引用到DataPointer的
,而不是复制。因此,在Java ByteBuffer的生命周期中,将内存范围保持在本机中。


分配并返回引用 从内存地址开始并扩展的内存块 容量字节

调用此函数并返回结果的本机代码 字节缓冲区对象到Java级别的代码应确保缓冲区 指可用于读取和存储的有效内存区域, 如果合适的话,写一封信。试图访问无效内存的尝试 Java代码中的位置将返回任意值,没有 可见效果,或导致引发未指定的异常


当然,您可以使用
get(byte[]dst,int offset,int length)
get byte array from ByteBuffer。

Yep,它返回指向
数据指针的ByteBuffer对象的引用。
:)