本人正在做一个项目,在android的java层通过JNI调用C去控制wifi的运行,借此实现wifi和3G同时打开的最终目的。其中向内核底层(如wpa)发送信号的C代码编译成.so运行库,在java层加载调用。
   在开始,当程序调用wifi.c的wifi_start_supplicant()时,会出现Cannot set RW to "/data/misc/wifi/wpa_supplicant.conf': Permission denied 的错误,就算给了wpa_supplicant.conf777的权限也无法解决,后来发现只要将这条路劲上的所有文件夹授予777权限就可以成功。
   解决这个问题后,又会再次出现新的问题,Failed to start supplicant daemon.:No such file or directory,后来经过在源码中追踪发现,在wifi.c中有这么一句:pi = __system_property_find(SUPP_PROP_NAME);而这个SUPP_PROP_NAME被定义为init.svc.wpa_supplicant,这是一个android的service,这时我发现只要在程序运行前,用adb命令setprop init.svc.wpa_supplicant "running"使它变成running状态就可以解决这个问题。
   接着就会出现最难搞的connection refused问题,log会提示Unable to open connection to supplicant on "/data/system/wpa_supplicant/wlan0"。
   本人查阅过相关资料,有人说是wifi的interface设置错误,但我查看过/proc/net/dev,在dev文件里wlan0是存在的,并且在平常用系统自带的setting打开wifi的时候用netcfg命令看到wifi用的就是wlan0接口。而本人也按照这个链接:http://blog.linuxconsulting.ro/2010/04/porting-wifi-drivers-to-android.html
   按着链接的步骤一步步设置好了路径,权限和用户/组等信息。并且在init.rc开启了wpa_supplicant和dhcpcd,并且都是使用了wlan0接口,同时权限和用户的设置是使用unix socket mode。但依旧是出现connection refused的错误。
   此外,补充一点就是本人的libhardware_legacy.so文件不明原因无法覆盖进/system/lib,每次一放进去都会死机,因此无法对wifi.c进行修改。

解决方案 »

  1.   

    补充一下:追踪程序发现程序是运行到wpa_ctrl.c的一个if判断语句而出错的,语句如下:
    if (connect(ctrl->s, (struct sockaddr *) &ctrl->dest,
        sizeof(ctrl->dest)) < 0) {
    LOGE("ctrl->s is : %d" , ctrl->s);
    LOGE("ctrl->s  : %s" , &ctrl->dest);
    close(ctrl->s);
    unlink(ctrl->local.sun_path);
    os_free(ctrl);
    LOGE("no connect can play and:%s", strerror(errno));
    return NULL;
    }
    望高手帮忙看看问题出在哪里0 0
      

  2.   

    您好!我是一名在校学生。我最近在项目中也需要实现wifi和3G同时开启同时传数据的功能,现在还完全没有头绪,不知该怎么实现。您可否留个联系方式给我(QQ),想向您请教一下,非常感谢!
      

  3.   

    你这JNI调用的太高端了,我估计论坛没几个人会。
      

  4.   

    1、Cannot set RW to "/data/misc/wifi/wpa_supplicant.conf 这个init.rc里面应该是需要配置权限的
    2、setprop init.svc.wpa_supplicant "running" 这个源码不是通过ctrl.start去启动的吗??.....Unable to open connection to supplicant on "/data/system/wpa_supplicant/wlan0" 这个应该是个权限问题,我现在也遇到这个问题。权限问题现在让我很困惑
      

  5.   

    不过我是应用程序通过jni 模仿wifimonitor去调用的。所以应该没有权限