2012-07-31 93 views
0

我写一个Android程序mydhcp送其上运行的dhcpcd命令(默认的Android程序DHCP):APK是否可以发送命令通过JNI运行dhcpcd?

dhcpcd eth0 

而且我写的APK接收BOOT_COMPLETED行动。当收到BOOT_COMPLETED时,它会调用我的共享库(JNI)libmydhcp.so来控制mydhcp。所有进程都运行成功,但dhcpcd启动失败。

在我的APK的AndroidManifest.xml已经设置的UID是一样的系统UID:

android:sharedUserId="android.uid.system" 

和其他用途的权限:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.INTERNET"/> 

崩溃点是主要的() ,它是在外部/ dhcpcd/dhcpcd.c

pidfd = open(pidfile, O_WRONLY | O_CREAT | O_NONBLOCK, 0664); 

如何修改以解决此问题?或者这是不可能的?

+0

是否有通过设备上的外壳来执行这些操作的方法吗?因为那时你可以执行从应用程序到shell的命令 – sbrichards 2012-07-31 06:15:40

+0

是的! mydhcp可以在shell中运行。这个pid文件是/data/misc/dhcp/dhcpcd-eth0.pid。我猜它不能执行的原因是这个目录用户/组是'dhcp'而不是'系统'。因为,当我将此目录用户/组更改为'系统'时它可以工作。但是现在我不想将用户/组更改为'system',可以让我的apk获得dhcp的uid吗? – Tony 2012-07-31 07:23:05

回答

0

运行命令为根,按照上面的评论:

public void RunAsRoot(String[] cmds){ 
     Process p = Runtime.getRuntime().exec("su"); 
     DataOutputStream os = new DataOutputStream(p.getOutputStream());    
     for (String tmpCmd : cmds) { 
       os.writeBytes(tmpCmd+"\n"); 
     }   
     os.writeBytes("exit\n"); 
     os.flush(); 
} 
+0

亲爱的sbrichards,我遇到了一个错误:写入失败:EPIPE(Broken pipe)。 – Tony 2012-08-01 03:00:22

相关问题