从jni返回bytebuffer是复制还是引用?

时间:2015-12-25 07:21:21

标签: java android java-native-interface

我将byte缓冲区从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,或者它是否复制到' byteBuffer' java层中的变量?

3 个答案:

答案 0 :(得分:2)

Java guide NewDirectByteBuffer

  

分配并返回指向的直接java.nio.ByteBuffer   从存储器地址开始并扩展的存储器块   容量字节。

     

调用此函数并返回结果的本机代码   byte-buffer对象到Java级代码应该确保缓冲区   是指可供阅读的有效记忆区域,   如果合适的话,写作。尝试访问无效内存   来自Java代码的位置将返回任意值,没有   可见效果,或导致抛出未指定的异常。

答案 1 :(得分:0)

它是referenced to the DataPointer,不是复制品。所以在Java ByteBuffer的生命周期中保留内存范围。

答案 2 :(得分:-1)

当然,您可以使用ByteBuffer中的get(byte[] dst, int offset, int length) get字节数组。