通过用allocateDirect创建的ByteBuffer的array()方法获得的byte []不是直接的

时间:2020-06-10 03:31:06

标签: java java-native-interface bytebuffer

我尝试使用ByteBuffer切片byte []数据。整个过程如下。

  1. 使用allocateDirect分配ByteBuffer。将分配的ByteBuffer的byte []添加到数据处理类的缓冲区队列中。
  2. 数据处理类将结果存储在缓冲区中,并将其作为回调返回。
  3. 在回调中,将接收到的byte []再次用ByteBuffer包裹,然后slice()调用本机方法。

切片的数据通过jni接口传输到本机代码。在这种情况下,jni要求直接分配ByteBuffer。问题是,如果我通过array()方法获得byte []并将其包装在ByteBuffer中,则它不再是直接状态。在这种情况下,有没有办法使ByteBuffer保持直接状态?还是有一种避免使用内存复制的解决方法?由于性能问题,我不想使用内存复制。

这是最少的代码示例。

ByteBuffer[] directBuffer = ByteBuffer.allocateDirect(bufferSize);

if (directBuffer.isDirect()) {
   Log.i(TAG, "Direct buffer!");
} else {
   Log.i(TAG, "Non direct buffer!");
}

ByteBuffer test = ByteBuffer.wrap(directBuffer.array());
if (test.isDirect()) {
   Log.i(TAG, "Direct buffer!");
} else {
   Log.i(TAG, "Non direct buffer!");
}

结果

Direct buffer!
Non direct buffer!

谢谢!

0 个答案:

没有答案