1

JNAを使用していますが、バイト配列を取得すると奇妙なエラーが発生します。

私はこのコードを使用します:

PointerByReference mac=new PointerByReference();
NativeInterface.getMac(mac);
mac.getPointer().getByteArray(0,8)

そして、IndexOutOfBoundsExceptionをスローします。境界が使用可能なスペースを超えています:size = 4、offset = 8も、返されるバイトが8バイトの長さであると確信している場合。その配列を文字列として取得しようとしました:

mac.getPointer().getString(0)

そして、ここで私は文字列8文字の長さを正常に取得します。理由がわかりますか?

ありがとうございました。

4

1 に答える 1

3

PointerByReference.getValue()Pointerあなたが探しているものを 返します。PointerByReference.getPointer()そのアドレスを返します。

mac.getPointer().getByteArray(0, 8)PointerByReferenceは、割り当てられたメモリ(ポインタ)から8バイトを読み取ろうとしており、それらのバイトをJavaプリミティブ配列に配置します。8バイトを要求していますが、割り当てられているのは4バイトしかないため、対応するエラーが発生します。

mac.getPointer().getString(0)は、ポインタ値に割り当てられたメモリからC文字列を読み取ろうとしています(あたかもそうであるかのようにconst char *、そのC文字列をJavaに変換しStringます。Java側で文字列の先頭を制限するだけなので、読み取りを続けます。ゼロ値が見つかるまで(技術的に範囲外であっても)メモリ。

編集

mac.getValue().getByteArray(0, 8)最初に取得しようとしていたもの(8バイトの配列)が表示されます。

編集

呼び出された関数がバッファに書き込むことになっている(バッファのアドレスを書き込んでいないbyte[])場合は、代わりに受け入れるようにシグネチャを変更する必要があります。

byte[] buffer = new byte[8];
getMac(buffer);
于 2012-05-22T11:07:57.223 に答える