2

我正在尝试从 android 应用程序(Android Jelly bean (4.1.2))中启动本机应用程序。我可以从 adb 手动启动本机应用程序,但它不是从 android 启动的。本机应用程序位于AsyncTask内部,由doInBackground函数启动。我用来在 android 中启动应用程序的命令是:

process = Runtime.getRuntime().exec("/data/data/MyAppDir/CAL_Android > /data/data/MyAppDir/out.txt 2>&1 &");

我将命令简化如下,但仍然没有启动:

process = Runtime.getRuntime().exec("/data/data/MyAppDir/CAL_Android");

我调试问题的各种尝试:

  1. 启动一个简单的命令,例如来自 android 的“touch file.txt”。作品
  2. 将本机应用程序移至 /data/local/tmp。不工作。
  3. 将执行权限更改为 777 (rwxrwxrwx)。不工作。
  4. 除了应用程序的所有者之外,将所有者更改为 root。不工作。
  5. 尝试使用线程(实现 Runnable而不是extends AsyncTask)。不工作。
  6. 使用“su -c”(“su -c /data/data/MyAppDir/CAL_Android”)执行命令。不工作。
  7. 将要执行的命令放在 shell 脚本中并从 Android 调用 shell 脚本。不工作。

我检查了 dmesg 输出,我得到的错误是:

<7>[14156.022980] CAL_Android: unhandled page fault (11) at 0x0000000c, code 0x017
<1>[14156.023010] pgd = e6204000
<1>[14156.026306] [0000000c] *pgd=b0728831, *pte=00000000, *ppte=00000000
<4>[14156.032777] 
<4>[14156.034242] Pid: 9408, comm:          CAL_Android
<4>[14156.051821] CPU: 0    Tainted: G        W     (3.4.0-ge11b2fc-dirty #1)
<4>[14156.061557] PC is at 0x4012aa22

有人可以告诉我问题是什么吗?

编辑: dmesg 输出不正确。再检查几次后,我没有在 dmesg 中收到错误消息。坠机似乎是由于不同的未知原因而发生的。但是我已经添加了无法从android启动本机应用程序的原因的答案。希望这可以帮助面临类似问题的人。

4

1 回答 1

0

通过使用以下 2 行并将它们打印在日志中,我发现了为什么 android 应用程序无法启动本机应用程序。

BufferedReader std_input = new BufferedReader(new InputStreamReader(process.getInputStream()));
BufferedReader std_error = new BufferedReader(new InputStreamReader(process.getErrorStream()));

String line;
while ((line = std_error.readLine()) != null) {
    Log.i(TAG, line);
}

当我在命令之前使用“su -c”时,我收到了以下错误消息:

su: uid <xyz> not allowed to su 

当我不使用“su -c”时,我得到了这个:

"Cannot open socket: Operation not permitted"

原因是android app没有root权限来启动native app,而native app需要root权限才能打开一个socket来发送和接收数据。

于 2013-10-31T15:35:08.947 回答