调试PPPOE, pppoe =>libppoe pppd=>libpppd。通过adb shell可以正确执行程序,正常拨号
root@android:/system/xbin # /system/xbin/libpppd pty '/system/xbin/libpppoe -p /system/xbin/pppoe.pid -I eth0 -T 80 -U -m 1412' noipdefault noauth default-asyncmap defaultroute  hide-password nodetach usepeerdns mtu 1492 mru 1492 noaccomp nodeflate nopcomp novj novjccomp user cd028 password  g55523  lcp-echo-interval 20 lcp-echo-failure 3
pppoe: send (sendPacket): Network is down
pppoe: recv (receivePacket): Network is down
pppoe: send (sendPacket): Network is down
pppoe: send (sendPacket): Network is down
pppoe: send (sendPacket): Network is down
pppoe: recv (receivePacket): Network is down
pppoe: Timeout waiting for PADO packets
10|root@android:/system/xbin # pppoe: send (sendPacket): Network is down
pppoe: send (sendPacket): Network is down
pppoe: Timeout waiting for PADO packets在JAVA层用exec先调用su,再调用上述命令也是OK的。但是由于JAVA层调用linux命令操作起来不是太方便,就用NDK来实现。
因为要用到pppoe的返回状态,所以用popen来调用这个命令。
        char commond[1000] = {0};
        sprintf(commond,"/system/xbin/libpppd pty '/system/xbin/libpppoe -p /system/xbin/pppoe.pid -I eth0 -T 80 -U -m 1412' noipdefault noauth default-asyncmap defaultroute  hide-password nodetach usepeerdns mtu 1492 mru 1492 noaccomp nodeflate nopcomp novj novjccomp user cd028 password  g55523  lcp-echo-interval 20 lcp-echo-failure 3 2>&1" );
        pf = popen(commond, "r");
        size = fread(buf, 1, 512, pf);
读到返回状态读到buf里边,然后用
__android_log_print(ANDROID_LOG_INFO, "JNIMsg", "buf = %s",buf);
打印出来,看到:
07-09 11:23:42.314: I/JNIMsg(25219): buf = /system/xbin/libpppd: This system lacks kernel support for PPP.  This could be because
07-09 11:23:42.314: I/JNIMsg(25219): the PPP kernel module could not be loaded, or because PPP was not
07-09 11:23:42.314: I/JNIMsg(25219): included in the kernel configuration.  If PPP was included as a
07-09 11:23:42.314: I/JNIMsg(25219): module, try `/sbin/modprobe -v ppp'.  If that fails, check that
07-09 11:23:42.314: I/JNIMsg(25219): ppp.o exists in /lib/modules/`uname -r`/net.
07-09 11:23:42.314: I/JNIMsg(25219): See README.linux file in the ppp distribution for more details.
07-09 11:23:42.324: D/ViewRootImpl(25219): pckname = com.example.calljavamethodfromnativecinndk
它所说的内核module的问题应该可以排除的,因为命令行是可以的。
感觉是权限的问题。我不知道怎么在NDK中获取root权限。我试图在java层执行su命令,然后jni,错误依旧。我在论坛找到同样的错误帖子:http://www.eoeandroid.com/thread-32158-1-1.html我在调试pppd拨号的过程中,通过命令行的的方式运行,没有问题。
但是如果我在Framework里面调用exec(String cmd)启动pppd的话,
执行不成功,Log如下:
E/pppd    ( 2082): This system lacks kernel support for PPP.  This could be because
E/pppd    ( 2082): the PPP kernel module could not be loaded, or because PPP was not
E/pppd    ( 2082): included in the kernel configuration.  If PPP was included as a
E/pppd    ( 2082): module, try `/sbin/modprobe -v ppp'.  If that fails, check that
E/pppd    ( 2082): ppp.o exists in /lib/modules/`uname -r`/net.
E/pppd    ( 2082): See README.linux file in the ppp distribution for more details.
哪位大哥知道是怎么回事啊?帮帮忙!
解决方法:
在system/core/init/property_service.c中修改pppd_gprs的执行权限,问题解决。
*/
struct {
    const char *service;
    unsigned int uid;
    unsigned int gid;
} control_perms[] = {
    {"dumpstate", AID_SHELL, AID_LOG },
    {"pppd_gprs", AID_RADIO, AID_LOG }, //add
    {NULL, 0, 0 }
};这个实验还没有做,因为我觉得java层都可以反倒C层不可以难以理解呀。还是我popen的问题呢?
我还在想要不要试试用纯C来调用一下这个命令看能否实现。
还有一个实验是AndroidManifest.xml的权限,我添加了
    <uses-permission android:name="android.permission.INTERNET"/>
        <uses-permission android:name="android.permission.FACTORY_TEST"/>
        <uses-permission android:name="android.permission.ADD_SYSTEM_SERVICE"/>
        <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
不过没有解决问题。Android