Судя по предоставленной вами информации, вы используете реализацию ByteBuffer, которая не позволяет нативному коду получить доступ к базовой структуре памяти.Он пытается получить доступ к прямой памяти в вашем ByteBuffer, чего он, вероятно, не должен делать, и терпит неудачу, потому что класс, производный от ByteBuffer, не хранит данные напрямую.
Если это критический код, который вы не можете изменить, лучше всего было бы создать ByteBuffer с использованием реализации Java, а затем скопировать исходные данные во временный буфер;Передайте новый буфер вашему собственному методу.Затем я бы профилировал код, чтобы увидеть, влияет ли это на производительность.
Вот пример того, как это сделать.Я немного не решаюсь использовать 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
Исключение в потоке "main"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)