Как мне сопоставить указатель на массив структур в JNA - PullRequest
0 голосов
/ 06 мая 2011

Я пытаюсь отобразить функцию Win32 EnumJobs в JNA. Метод имеет следующую подпись:

BOOL EnumJobs(
  __in   HANDLE hPrinter,
  __in   DWORD FirstJob,
  __in   DWORD NoJobs,
  __in   DWORD Level,
  __out  LPBYTE pJob,
  __in   DWORD cbBuf,
  __out  LPDWORD pcbNeeded,
  __out  LPDWORD pcReturned
);

Я выяснил большинство из них, за исключением pJob LPBYTE, который согласно документации является указателем на буфер, который получает массив структур JOB_INFO. Я не могу понять, как правильно сделать это отображение. Пока что у меня есть:

   boolean EnumJobs(HANDLE hPrinter, DWORD FirstJob, DWORD NoJobs, DWORD Level, JOB_INFO_2[] pJob, DWORD cbBuf, IntByReference pcbNeeded, IntByReference pcReturned );

но я получаю IllegalArgumentException: не могу определить размер вложенной структуры: не могу создать экземпляр класса com.sun.jna.structure (java.lang.InstantiationException). Любое понимание того, как это должно отображаться и обрабатывать, может с благодарностью.

1 Ответ

2 голосов
/ 06 мая 2011

1) выясните, сколько структур JOB_INFO вам нужно (или хотите)

2) Используйте Structure.toArray () для одного экземпляра JOB_INFO, чтобы получить их непрерывный (в памяти) массив

3) Передайте первую структуру JOB_INFO или ее память (Structure.getPointer) в зависимости от сигнатуры вашего метода.

Обратите внимание, что аргумент Structure в сигнатуре метода будет указывать JNA, что ему необходимо автоматически синхронизировать память структуры Java с собственной памятью (включая весь массив); использование указателя оставляет синхронизацию на ваше усмотрение.

Кроме того, структура как параметр метода подразумевает "struct *", а не "struct" как тип аргумента.

...