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. スレッドを使用してみました(extends AsyncTaskの代わりにRunnable を実装します)。動作しませんでした。
  6. "su -c" ("su -c /data/data/MyAppDir/CAL_Android") を使用してコマンドを実行します。動作しませんでした。
  7. 実行するコマンドをシェル スクリプト内に配置し、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からネイティブアプリを起動できない理由への回答を追加しました。うまくいけば、これは同様の問題に直面している人に役立ちます。

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 アプリにはネイティブ アプリを起動するためのルート権限がなく、ネイティブ アプリはデータを送受信するためのソケットを開くためのルート権限を必要とするためです。

于 2013-10-31T15:35:08.947 に答える