我正在使用JNA,在获取字节数组时遇到一个奇怪的错误。
我使用此代码:
PointerByReference mac=new PointerByReference();
NativeInterface.getMac(mac);
mac.getPointer().getByteArray(0,8)
它抛出一个 IndexOutOfBoundsException:边界超出可用空间:size=4,偏移量=8,如果我确定返回的字节是 8 字节长度。我试图将该数组作为字符串:
mac.getPointer().getString(0)
在这里,我成功地获得了字符串 8 个字符的长度。你能理解为什么吗?
谢谢。
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);