Мне нужно загрузить сырой двоичный ресурс в приложение для 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.
Есть ли способ избежать этого дополнительного копирования данных при передаче двоичного ресурса на уровень JNI?