Получение массива через JNA

У меня возникла проблема с получением информации из блока памяти, выделенного вызываемой функцией. В частности, в библиотеке X11, включенной в JNA, есть функция XGetWindowProperties. Он возвращает результаты через последний параметр — PointerByReference prop_return.

Я знаю, что фактическая область памяти содержит массив Window. Но как мне создать эти объекты? Я не вижу способа получить его из самого указателя и не могу получить из него Buffer, так как не знаю размер Window.

Настоящая функция такова: int XGetWindowProperty(...., unsigned char **prop_return) и с параметрами, с которыми я ее вызываю, на самом деле это int XGetWindowProperty(...., Window *prop_return[]).


person viraptor    schedule 20.11.2010    source источник


Ответы (2)


Размер элементов в возвращаемых данных определяется возвращаемым «форматом» из XGetWindowProperty(), за одним досадным исключением. Xlib всегда возвращает формат 32 как массив «long», даже если «long» 64-битный. Окно будет иметь формат 32.

В быстром поиске Google вы можете использовать NativeLong.SIZE, чтобы определить это в JNA. Итак, если (NativeLong.SIZE == 8) у вас есть буфер 64-битных идентификаторов окон, в противном случае - 32-битных идентификаторов окон.

Порядок байтов каждого значения должен соответствовать процессору, на котором вы работаете.

person Havoc P    schedule 20.11.2010
comment
Хотя это решает мою насущную проблему, я все же хотел бы увидеть общее решение: как перейти от PointerByReference к массиву известных типов с собственным отображением. - person viraptor; 20.11.2010
comment
да, я не могу ответить на вопрос JNA, только на вопрос Xlib. fwiw Окно - это просто целочисленный идентификатор, это не объект в каком-либо осмысленном смысле. - person Havoc P; 20.11.2010

Сначала вам нужно будет извлечь данные в виде массива примитивного типа (int или long, если это необходимо). затем вы можете создавать объекты X11.Window по мере необходимости, используя XID из массива.

Можно настроить конвертеры для автоматической обработки некоторых из них, но, в конечном счете, одноразовому пользователю проще выполнить преобразование явно.

person technomage    schedule 06.05.2011