我将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层中的变量?
答案 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字节数组。