1

我正在使用 JNA,但在获取字节数组时遇到了一个奇怪的错误。

我使用这段代码:

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

如果我确定返回的字节是 8 字节长度,它也会抛出一个 IndexOutOfBoundsException:边界超出可用空间:大小 = 4,偏移量 = 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 回答