2011-05-05 110 views
0

我试图在JNA中映射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 
); 

我想出大部分除了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)任何见解进入如何映射和处理将不胜感激。

回答

2

1)找出有多少JOB_INFO结构需要(或希望)

2)使用Structure.toArray()上JOB_INFO的单个实例,让他们的连续(存储器)阵列

3)根据您的方法签名传递第一个JOB_INFO结构或其内存(Structure.getPointer)。

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

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

+0

我得到了传递指针的函数调用。我不太清楚您的Java结构内存与本机内存的同步是什么意思。有没有这样做的例子? – 2011-05-06 14:42:20

+0

没关系想通了。在添加EnumJobs调用之前,需要调用JOB_INFO_2结构的写入方法,然后我需要调用JOB_INFO_2结构的read方法。谢谢你的帮助! – 2011-05-06 14:56:23