我遇到了从被调用函数分配的内存块中获取信息的问题。具体来说,JNA包含的X11库中有函数XGetWindowProperties
。它通过最后一个参数 - PointerByReference prop_return
返回结果。
我知道实际的内存区域包含Window
的数组。但是我该如何创建这些对象呢?我没有看到任何方法从指针本身获取它并且我无法从中获取Buffer
,因为我不知道Window
的大小。
真正的功能是:int XGetWindowProperty(...., unsigned char **prop_return)
并且使用我正在调用它的参数,它实际上是int XGetWindowProperty(...., Window *prop_return[])
。
答案 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对象。
可以设置转换器来自动处理其中的一部分,但最终一次性显式转换更简单。