Java中WlanEnumInterfaces(Windows本机WiFi)的奇数返回

Java中WlanEnumInterfaces(Windows本机WiFi)的奇数返回,java,native,jna,wifi,Java,Native,Jna,Wifi,我正在尝试用Java映射Windows本机Wifi API,但WlanEnumInterfaces函数有问题。基本上,此函数输出一个包含WLAN接口信息结构数组的WLAN接口信息列表结构。 当我在Java程序中调用WlanEnumInterfaces时,其返回值表示函数成功,但当我检查WLAN_INTERFACE_INFO数组中的项数时,会得到不一致的值,如1367280或4000000。此值应为1,因为我的计算机上只有一个无线接口。 这是我对WlanEnumInterfaces函数的映射: p

我正在尝试用Java映射Windows本机Wifi API,但WlanEnumInterfaces函数有问题。基本上,此函数输出一个包含WLAN接口信息结构数组的WLAN接口信息列表结构。 当我在Java程序中调用WlanEnumInterfaces时,其返回值表示函数成功,但当我检查WLAN_INTERFACE_INFO数组中的项数时,会得到不一致的值,如1367280或4000000。此值应为1,因为我的计算机上只有一个无线接口。 这是我对WlanEnumInterfaces函数的映射:

public int WlanEnumInterfaces(
        HANDLE hClientHandle,
        PointerByReference pReserved,
        WLAN_INTERFACE_INFO_LIST.ByReference ppInterfaceList);
HANDLE wlanHandle = getWlanHandle();
WLAN_INTERFACE_INFO_LIST.ByReference ppInterfaceList = new WLAN_INTERFACE_INFO_LIST.ByReference();

int ret = Wlanapi.INSTANCE.WlanEnumInterfaces(wlanHandle,null,ppInterfaceList);
System.out.println("Return: " + ret);    
System.out.println("WlanEnumInterfaces->number of items: "+ppInterfaceList.dwNumberOfItems);
无线局域网接口信息列表的实现:

public static class WLAN_INTERFACE_INFO_LIST extends Structure {
    public static class ByReference extends WLAN_INTERFACE_INFO_LIST implements Structure.ByReference{}
    public int dwNumberOfItems;
    public int dwIndex;
    public WLAN_INTERFACE_INFO[] InterfaceInfo = new WLAN_INTERFACE_INFO[10];


    @Override
    protected List getFieldOrder() {
        return Arrays.asList(new String[] {"dwNumberOfItems","dwIndex","InterfaceInfo"});
    }
}
以及调用函数的部分代码:

public int WlanEnumInterfaces(
        HANDLE hClientHandle,
        PointerByReference pReserved,
        WLAN_INTERFACE_INFO_LIST.ByReference ppInterfaceList);
HANDLE wlanHandle = getWlanHandle();
WLAN_INTERFACE_INFO_LIST.ByReference ppInterfaceList = new WLAN_INTERFACE_INFO_LIST.ByReference();

int ret = Wlanapi.INSTANCE.WlanEnumInterfaces(wlanHandle,null,ppInterfaceList);
System.out.println("Return: " + ret);    
System.out.println("WlanEnumInterfaces->number of items: "+ppInterfaceList.dwNumberOfItems);
有人知道发生了什么吗?
谢谢

WlanEnumInterfaces用结构的地址填充您提供的字段。您传递的是结构的地址,而不是地址的地址

使用
PointerByReference
获取结构的地址,例如

PointerByReference pref = new PointerByReference();
Wlanapi.INSTANCE.WlanEnumInterfaces(handle, null, pref);
WLAN_INTERFACE_INFO_LIST list = new WLAN_INTERFACE_INFO_LIST(pref.getValue());
然后,您需要一个基于
指针的构造函数,用于
WLAN\u接口\u信息\u列表
,即

WLAN_INTERFACE_INFO_LIST(Pointer p) {
    super(p);
    this.dwNumberOfItems = p.readInt(0);
    this.InterfaceInfo = new WLAN_INTERFACE_INFO[this.dwNumberOfItems];
    read();
}

事实上,我一直在苦苦挣扎,因为我不知道如何操纵PointerByReference来获取WLAN\u接口\u信息\u列表。秘密是基于指针的构造函数。非常感谢。