提供した情報に基づいて、ネイティブコードが基礎となるメモリ構造にアクセスできるようにしないByteBuffer実装を使用しているようです。ByteBufferの直接メモリにアクセスしようとしていますが、これはおそらくそれを行うべきではないことであり、ByteBufferから派生したクラスがデータを直接保存しないために失敗しています。
これが変更できない重要なコードである場合は、Java 実装を使用して ByteBuffer を作成し、元のデータを一時バッファーにコピーすることをお勧めします。新しいバッファをネイティブ メソッドに渡します。次に、コードをプロファイリングして、パフォーマンスへの影響があるかどうかを確認します。
これを行う方法の例を次に示します。ByteBuffer の実装が何を返すかわからないため、ByteBuffer のインターフェイスが正しく実装されていることを確認してくださいrewind()
。limit()
このコードは、余分なデータが追加されていないことを示すために、意図的にインデックス 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.indexOutofboundsecectionの例外
at java.nio.Buffer.checkIndex(Buffer.java:514)
at java.nio.HeapByteBuffer.get(HeapByteBuffer.java:121)
at stackoverflow_4534583.Main.main(Main.java:35)