如何将指针映射到JNA中的结构数组

时间:2011-05-05 20:09:04

标签: java winapi jna

我正在尝试在JNA中映射Win32函数EnumJobs。该方法具有以下特征:

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
);

除了LPBYTE pJob之外,我想出了大部分内容,根据文档,它是指向接收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 个答案:

答案 0 :(得分:2)

1)弄清楚你需要(或想要)多少个JOB_INFO结构

2)在单个JOB_INFO实例上使用Structure.toArray()来获取它们的连续(在内存中)数组

3)传入第一个JOB_INFO结构或其内存(Structure.getPointer),具体取决于您的方法签名。

请注意,方法签名中的Structure参数将向JNA指示它需要自动将Java结构内存与本机内存(包括整个数组)同步;使用指针离开同步到你。

此外,作为方法参数的Structure表示“struct *”,而不是“struct”作为参数类型。