我真的想获得一个指向结构数组的指针,就像在 C 中一样,使用 Java jna。我想访问 EnumPrinters()
函数,以下是它的参数:
BOOL EnumPrinters(
_In_ DWORD Flags,
_In_ LPTSTR Name,
_In_ DWORD Level,
_Out_ LPBYTE pPrinterEnum,
_In_ DWORD cbBuf,
_Out_ LPDWORD pcbNeeded,
_Out_ LPDWORD pcReturned
);
在 Java 中是
public boolean EnumPrinters(int i, String string, int i1, com.sun.jna.Pointer pntr, int i2,
com.sun.jna.ptr.IntByReference ibr, com.sun.jna.ptr.IntByReference ibr1);
我遇到的问题是我不断收到错误 122,这意味着调用系统调用失败。这是我的代码:
IntByReference pcbNeeded= new IntByReference();
int pcb=0;
pcbNeeded.setValue(pcb);
IntByReference pcReturned= new IntByReference();
int pcR=0;
pcReturned.setValue(pcR);
PRINTER_INFO_4 printer = new PRINTER_INFO_4();
PRINTER_INFO_4 PRINT[] = (PRINTER_INFO_4[])printer.toArray(20);
Pointer point = PRINT[0].getPointer();
int size = PRINT[0].size();
Winspool.INSTANCE.EnumPrinters(Winspool.PRINTER_ENUM_LOCAL,null, 4, point, size,pcbNeeded ,pcReturned);
System.out.println("Operation started!");
System.out.println(printer.pPrinterName);
int rc = Kernel32.INSTANCE.GetLastError();
System.out.println("error " + rc);
我只想使用代码获取计算机上所有已安装的打印机。
最佳答案
您需要传递第一个结构而不是其地址的指针副本,否则 JNA 不知道自动将 Java 结构与 native 内存同步。
public boolean EnumPrinters(int i, String string,
int i1, PRINTER_INFO_4 pntr,
int i2, com.sun.jna.ptr.IntByReference ibr,
com.sun.jna.ptr.IntByReference ibr1);
您还应该保留原始参数名称,这将使映射更具可读性。
您还可以在 native 调用之前对每个分配的 Structure
显式调用 Structure.write()
,以及 Structure.read()
调用之后,但 JNA 在识别出函数签名中的 Structure
时会自动执行此操作(包括所有数组元素,如果有)。
关于java - 如何在jna中获取指向结构体数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38441180/