未处理的页面错误(11)在0x0000000c,代码0x017

时间:2013-10-30 20:20:22

标签: android c android-asynctask

我正在尝试从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 而不是扩展AsyncTask )。没用。
  6. 使用“su -c”执行命令(“su -c / data / data / MyAppDir / CAL_Android”)。没用。
  7. 将命令放在shell脚本中执行,并从Android调用shell脚本。没用。
  8. 我检查了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启动本机应用程序的原因。希望这可以帮助那些面临类似问题的人。

1 个答案:

答案 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权限才能打开用于发送和接收数据的套接字。