java - JNA - 映射 native Windows 数据类型(IN 和 OUT 参数)

标签 java windows jna

我正在尝试通过 JNA 在 Java 中使用 IP-USB-Hub (AnywhereUSB) 的 Windows API。我成功加载了 dll,现在我必须映射函数。 我有一个头文件,它声明了一个枚举和一些函数,如下所示:

typedef enum AWUSB_STATUS_tag{
    AWUSB_STATUS_CONNECTED,
    AWUSB_STATUS_ALREADY_CONNECTED,
    AWUSB_STATUS_INVALID_PARAMETER,
    AWUSB_STATUS_TIMEOUT,
    AWUSB_STATUS_CANCELLED,
    AWUSB_STATUS_SUCCESS,
    ...
}AWUSB_STATUS, *PAWUSB_STATUS;

AWUSB_STATUS AwUsbGetConnectionStatus (
   IN   LPCWSTR Hub,
   OUT  PDWORD  IpAddress,
   OUT  PAWUSB_STATUS   Status,
   IN   DWORD   Timeout,
   IN   HANDLE  hEvent OPTIONAL
);

令我恼火的是 IN、OUT 和 OPTIONAL 参数。 我不太明白这些标签的含义。 我如何在 Java 中处理它们?

到目前为止,我在 Java 中这样声明它们:

    public static interface AWUSB_STATUS_tag {
        public static final int AWUSB_STATUS_CONNECTED = 0;
        public static final int AWUSB_STATUS_ALREADY_CONNECTED = 1;
        public static final int AWUSB_STATUS_INVALID_PARAMETER = 2;
        public static final int AWUSB_STATUS_TIMEOUT = 3;
        ...
    };

    int AwUsbGetConnectionStatus(WString Hub, int IpAdress, IntBuffer Status, int Timeout, Pointer hEvent);

映射正确吗?我需要做什么才能调用该函数?

提前致谢!

最佳答案

一般来说,“OUT”意味着你需要传递一个指针值,通常是&my_variable形式的变量引用。为此,JNA 为原语提供了 XXXByReference 类型,您也可以定义自己的类型。您创建该类型参数的实例,然后使用 getValue() 检索“结果”,例如

IntByReference iref = new IntByReference();
lib.myCall(iref);
int value = iref.getValue();

如果您设置了默认类型映射器,则可以使用 String 代替 WString(请参阅其他 Windows API 库映射的默认初始化)。

MyLib mylib = (MyLib)Native.loadLibrary("mylib", W32APIOptions.DEFAULT_OPTIONS);    

对于此 native 代码:

AWUSB_STATUS AwUsbGetConnectionStatus (
   IN   LPCWSTR Hub,
   OUT  PDWORD  IpAddress,
   OUT  PAWUSB_STATUS   Status,
   IN   DWORD   Timeout,
   IN   HANDLE  hEvent OPTIONAL
);

// Java mapping
int AwUsbGetConnectionStatus(String Hub, DWORDByReference IpAddress, IntByReference Status, DWORD Timeout, HANDLE hEvent);

那些“OUT”参数需要是指针类型。

关于java - JNA - 映射 native Windows 数据类型(IN 和 OUT 参数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40240327/

相关文章:

java - 使用 Outpan 的 JAVA API

python - 如何在cmd中运行不同的python版本

java - 用于生成 Java JNA 包装器的 jnaerator 的 SimpleMeaningfulExample 将不起作用

java - 通过 JNA Java 使用 SetParent 时,父窗口速度大大减慢

java - 查找要添加对象的 ArrayList 索引的方法

java - 未能初始化 GregorianCalendar 对象

java - 为什么会出现java.lang.IllegalStateException这个错误?

c++ - 如何正确终止 dll 中的挂起线程?

windows - Windows 上的 OpenGL ICD 如何加载 OpenGL 1.0 和 1.1 功能?

java - 为什么当调用带有回调的方法时我没有得到任何输出?