2012-07-31 91 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

相關問題