我正在尝试从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");
我调试此问题的各种尝试:
我检查了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启动本机应用程序的原因。希望这可以帮助那些面临类似问题的人。
答案 0 :(得分:0)
我发现为什么Android应用程序无法启动本机应用程序,使用以下2行并在日志中打印它们。
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应用程序没有启动本机应用程序的root权限,而本机应用程序需要root权限才能打开用于发送和接收数据的套接字。