通过JNA检索数组

时间:2010-11-20 12:09:00

标签: java x11 jna

我遇到了从被调用函数分配的内存块中获取信息的问题。具体来说,JNA包含的X11库中有函数XGetWindowProperties。它通过最后一个参数 - PointerByReference prop_return返回结果。

我知道实际的内存区域包含Window的数组。但是我该如何创建这些对象呢?我没有看到任何方法从指针本身获取它并且我无法从中获取Buffer,因为我不知道Window的大小。

真正的功能是:int XGetWindowProperty(...., unsigned char **prop_return)并且使用我正在调用它的参数,它实际上是int XGetWindowProperty(...., Window *prop_return[])

2 个答案:

答案 0 :(得分:2)

返回数据中元素的大小由XGetWindowProperty()返回的“格式”定义,有一个令人讨厌的异常。即使“long”是64位,Xlib也总是将格式32作为“long”数组返回。窗口的格式为32。

在快速谷歌搜索中,您可以使用NativeLong.SIZE在JNA中确定这一点。 因此,如果(NativeLong.SIZE == 8)你有一个64位窗口ID的缓冲区,否则就是32位窗口ID。

每个值的字节顺序应与您所在的CPU匹配。

答案 1 :(得分:1)

您需要首先将数据提取为基本类型数组(适当时为int或long)。然后,您可以根据需要使用阵列中的XID构造X11.Window对象。

可以设置转换器来自动处理其中的一部分,但最终一次性显式转换更简单。