【问题标题】:How do I map a pointer to an array of structures in JNA如何将指针映射到 JNA 中的结构数组
【发布时间】:2011-05-05 20:09:04
【问题描述】:

我正在尝试在 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: Can't determine size of nested structure: can't instantiate class com.sun.jna.structure (java.lang.InstantiationException) 任何关于如何映射和处理的见解都会不胜感激。

【问题讨论】:

    标签: java winapi jna


    【解决方案1】:

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

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

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

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

    此外,作为方法参数的结构意味着“struct *”,而不是作为参数类型的“struct”。

    【讨论】:

    • 我得到了函数调用来传递一个指针。我不太确定将我的 Java 结构内存与本机内存同步是什么意思。有没有例子说明这是如何做到的?
    • 没关系想通了。在添加 EnumJobs 调用之前需要调用 JOB_INFO_2 结构的 write 方法,然后需要在 JOB_INFO_2 结构上调用 read 方法。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 2015-06-26
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    相关资源
    最近更新 更多