JNA: указатель на указатель на структуру - PullRequest
1 голос
/ 11 марта 2012

У меня есть вызов функции:

long foo(mystruct **list)

, где определение mystruct равно

typedef struct {
    otherstruct *bar[64];
} mystruct;

, и я пытаюсь получить в(JNA) Структура [], соответствующая столбцу.Мое текущее определение функции - int foo(PointerByReference list);, так как это указатель на указатель, но я не могу понять, как получить Structure [].

В C код используется следующим образом:

mystruct *list;
foo(&list);
for (i=0; i<64; i++)
    doStuff(list->bar[i]);

1 Ответ

2 голосов
/ 13 марта 2012
  1. PointerByReference подходит;используйте getValue() для получения значения Pointer.
  2. С этим значением инициализируйте вашу структуру "mystruct"
  3. Поскольку "otherstruct *bar[64]" представляет массив struct*, вам нужноявное использование поля типа Structure.ByReference[], чтобы заставить JNA обрабатывать массив как указатели вместо встроенных структур.

code:

class OtherStruct extends Structure {
    class ByReference extends OtherStruct implements Structure.ByReference { }
    ...
}
class MyStructure extends Structure {
    public OtherStruct.ByReference[] bar = new OtherStruct.ByReference[64];
}

JNA должен неявно вызывать Structure.read () и Structure.write (), где это необходимо, при вызове собственных функций, но вне этого вам может потребоваться сделать эти вызовы явно в зависимости от вашего использования.

...