JNA - Map Native Windows 数据类型(IN 和 OUT 参数)
JNA - Map Native Windows Data Types (IN and OUT parameters)
我正在尝试将 Java 中的 IP-USB-Hub (AnywhereUSB) 的 Windows API 与 JNA 一起使用。我设法加载了 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()
检索 "result",例如
IntByReference iref = new IntByReference();
lib.myCall(iref);
int value = iref.getValue();
你可以使用String
代替WString
,如果你设置默认类型映射器这样做(参考其他windowsAPI库的默认初始化映射)。
MyLib mylib = (MyLib)Native.loadLibrary("mylib", W32APIOptions.DEFAULT_OPTIONS);
对于本机代码:
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 中的 IP-USB-Hub (AnywhereUSB) 的 Windows API 与 JNA 一起使用。我设法加载了 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()
检索 "result",例如
IntByReference iref = new IntByReference();
lib.myCall(iref);
int value = iref.getValue();
你可以使用String
代替WString
,如果你设置默认类型映射器这样做(参考其他windowsAPI库的默认初始化映射)。
MyLib mylib = (MyLib)Native.loadLibrary("mylib", W32APIOptions.DEFAULT_OPTIONS);
对于本机代码:
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"参数需要是指针类型。