JNA - 映射本机Windows数据类型(IN和OUT参数)

时间:2016-10-25 12:44:08

标签: java windows jna

我正在尝试使用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);

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

提前致谢!

1 个答案:

答案 0 :(得分:1)

一般来说," 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);    

对于此本机代码:

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"参数必须是指针类型。