java - 如何在jna中获取指向结构体数组的指针

标签 java c jna

我真的想获得一个指向结构数组的指针,就像在 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/

相关文章:

java - 如何通过 Spring Rest 模板使用原始数据进行发布请求

c - 如何从信号处理程序内部向其他进程发送通知?

java - java中指向函数的指针

java - 线程中出现异常 "main"java.lang.UnsatisfiedLinkError : jnidispatch (/com/sun/jna/win32-x86/jnidispatch. dll) 在资源路径中找不到

java - JNA - 尝试使用 void* 参数访问 C 函数时虚拟机崩溃

java - 请讨论我的 Java 代码以找到因素(是否正确?)

java - 用于 Java 的开源 3D 渲染引擎

java - swing GUI 组件的计时器问题

c - lseek 稀疏文件与常规文件的比较导致意外结果?

c - C 中包含指针的段错误(核心转储)