Получение массива через JNA - PullRequest
0 голосов
/ 20 ноября 2010

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

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

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

Ответы [ 2 ]

2 голосов
/ 20 ноября 2010

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

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

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

1 голос
/ 06 мая 2011

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

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

...