Java 从jni返回bytebuffer是副本还是引用?
我将bytebuffer从jni返回到java层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(&
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对象的引用。
:)