static int init() { ioctl_sock = socket(PF_INET, SOCK_DGRAM, 0); if (ioctl_sock < 0) { printMsg("Bad socket: %d\n", ioctl_sock); return errno; } else { printMsg("Good socket: %d\n", ioctl_sock); } int ret = linux_set_iface_flags(ioctl_sock, "wlan0", 1); if (ret < 0) { return ret; } wifi_error res = wifi_initialize(&halHandle); if (res < 0) { return res; } res = wifi_get_ifaces(halHandle, &numIfaceHandles, &ifaceHandles); if (res < 0) { return res; } char buf[EVENT_BUF_SIZE]; for (int i = 0; i < numIfaceHandles; i++) { if (wifi_get_iface_name(ifaceHandles[i], buf, sizeof(buf)) == WIFI_SUCCESS) { if (strcmp(buf, "wlan0") == 0) { printMsg("found interface %s\n", buf); wlan0Handle = ifaceHandles[i]; } else if (strcmp(buf, "p2p0") == 0) { printMsg("found interface %s\n", buf); p2p0Handle = ifaceHandles[i]; } } } return res; }
static int android_net_wifi_getInterfaces(JNIEnv *env, jclass cls) { int n = 0; wifi_handle halHandle = getWifiHandle(env, cls); wifi_interface_handle *ifaceHandles = NULL; int result = wifi_get_ifaces(halHandle, &n, &ifaceHandles); if (result < 0) { return result; } if (n < 0) { THROW(env, "android_net_wifi_getInterfaces no interfaces"); return 0; } if (ifaceHandles == NULL) { THROW(env, "android_net_wifi_getInterfaces null interface array"); return 0; } if (n > 8) { THROW(env, "Too many interfaces"); return 0; } jlongArray array = (env)->NewLongArray(n); if (array == NULL) { THROW(env, "Error in accessing array"); return 0; } jlong elems[8]; for (int i = 0; i < n; i++) { elems[i] = reinterpret_cast<jlong>(ifaceHandles[i]); } env->SetLongArrayRegion(array, 0, n, elems); setStaticLongArrayField(env, cls, WifiIfaceHandleVarName, array); return (result < 0) ? result : n; }