根据您提供的信息,您似乎正在使用不允许本机代码访问底层内存结构的 ByteBuffer 实现。它试图访问您的 ByteBuffer 中的直接内存,它可能不应该这样做,并且由于派生自 ByteBuffer 的类不直接存储数据而失败。
如果这是您无法更改的关键代码,最好的办法是使用 Java 实现创建一个 ByteBuffer,然后将原始数据复制到临时缓冲区中;将新缓冲区传递给您的本机方法。然后我会分析代码以查看它是否会影响性能。
这是一个如何执行此操作的示例。我对使用有点犹豫rewind()
,limit()
因为我不知道 ByteBuffer 的实现会返回什么,所以请检查以确保它正确实现了 ByteBuffer 的接口。
此代码故意非法访问索引 3,以表明未添加额外数据。
public static void main(String[] args) {
// This will be your implementation of ByteBuffer that
// doesn't allow direct access.
ByteBuffer originalBuffer = ByteBuffer.wrap(new byte[]{12, 50, 70});
originalBuffer.rewind();
byte[] newArray = new byte[originalBuffer.limit()];
originalBuffer.get(newArray, 0, newArray.length);
ByteBuffer newBuffer = ByteBuffer.wrap(newArray);
System.out.println("Limit: " + newBuffer.limit());
System.out.println("Index 0: " + newBuffer.get(0));
System.out.println("Index 1: " + newBuffer.get(1));
System.out.println("Index 2: " + newBuffer.get(2));
System.out.println("Index 3: " + newBuffer.get(3));
}
输出:
限制:3
索引 0:12
指数1:50
指数2:70
线程“主”java.lang.IndexOutOfBoundsException 中的异常
at java.nio.Buffer.checkIndex(Buffer.java:514)
at java.nio.HeapByteBuffer.get(HeapByteBuffer.java:121)
at stackoverflow_4534583.Main.main(Main.java:35)