我需要在Android应用程序中加载原始二进制资源,并将其传递给JNI函数。为了避免复制数据,我必须使用allocateDirect()和GetDirectBufferAddress():
在Java方面:
ByteBuffer buf = ByteBuffer.allocateDirect(size);
在JNI方面:
const uint8_t* buf = (const uint8_t*)env->GetDirectBufferAddress(i_buf);
同时,为了将资源读入字节缓冲区,我需要使用ByteBuffer.wrap()方法:
data = new byte[istream.available()];
istream.read(data);
buf = ByteBuffer.wrap(data);
这两种方法似乎不兼容。字节缓冲区可以包装,也可以直接包装,但不能同时包装。这导致必须创建整个资源的至少一个副本,或者将其加载到直接字节缓冲区中(通过使用中间包装的缓冲区),或者从JNI层中的非直接缓冲区访问数据时。 / p>
在将二进制资源传递到JNI层时,有什么方法可以避免这种额外的数据复制?