java - Java 中 WlanEnumInterfaces(Windows Native WiFi)的奇怪返回

标签 java native jna wifi

我正在尝试用 Java 映射 Windows Native Wifi API,但 WlanEnumInterfaces 函数遇到问题。基本上,该函数输出一个包含 WLAN_INTERFACE_INFO 结构数组的 WLAN_INTERFACE_INFO_LIST 结构。 当我在Java程序中调用WlanEnumInterfaces时,它的返回值表明函数成功,但是当我检查WLAN_INTERFACE_INFO数组中的项目数时,我得到不一致的值,例如1367280或4000000。这个值应该是1,因为我只有我的机器上有一个无线接口(interface)。 这是我对 WlanEnumInterfaces 函数的映射:

public int WlanEnumInterfaces(
        HANDLE hClientHandle,
        PointerByReference pReserved,
        WLAN_INTERFACE_INFO_LIST.ByReference ppInterfaceList);

WLAN_INTERFACE_INFO_LIST 的实现:

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"});
    }
}

以及调用该函数的部分代码:

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());

然后您需要一个基于 PointerWLAN_INTERFACE_INFO_LIST 构造函数,即

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

关于java - Java 中 WlanEnumInterfaces(Windows Native WiFi)的奇怪返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23348600/

相关文章:

android - 是否可以在 React-Native 中使用内置的视频播放器

c++ - 以编程方式连接到无线网络

java - 如何使用 JNA 获取 Activity 窗口的应用程序名称?

java - 类之间的 IReport 和 getter

java - 如何从仅提供 JSON 服务的服务器获取 JSONP?

java - 通过 jdbc 瘦驱动程序连接时出现 ORA-01017

android - 为 ARM 编写的原生 android 代码如何在 x86 上运行?

java - 从正确的对象引用中使用 volatile 变量

java - MAC OSX-Write Xcode .Dylib 用于 JNA (Java Native Access) -JAVA

java - 使用 jna 调用 ioctl 系统调用