将二进制资源传递到JNI层

时间:2018-09-16 09:41:02

标签: java android java-native-interface resources

我需要在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层时,有什么方法可以避免这种额外的数据复制?

0 个答案:

没有答案