0

Android アプリを使用してネイティブ バイナリを起動しています。そのバイナリの出力をアプリケーションの小さなウィンドウに表示したいと思います。出力を TextView に表示するか、ターミナルを小さなウィンドウに表示するにはどうすればよいですか (推奨)。

ありがとう。

4

2 に答える 2

1

アレックスがリンクした記事の要点はRuntime.exec()、オブジェクトを返すProcessことです。これにより、プロセスの標準出力 (およびstderrも) を Java 経由でストリームとして取得できますProcess.getOutputStream()/getErrorStream()。それらを取得し、スレッドで読み取り (適切にブロックします。UI スレッドをブロックしたくありません)、データを UI スレッドに戻します。はるかに優れています。以前の回答を取り消します。

この記事では、ストリームを でラップすることも推奨してBufferedReaderいますreadLine

于 2012-10-01T23:59:36.470 に答える
0

これが1つのスキームです。これには NDK は必要ありません。

アプリのデータ ディレクトリに一時ファイルを作成します。を使用して、コマンド ラインで出力方向として同じファイルを指定して、バイナリを実行しますRuntime.exec()。指定する必要があるコマンド ラインは、バイナリ自体ではなく を呼び出します。またsh、コマンド ライン パラメータの 1 つはリダイレクト:>myfile.txtです。

次に、同じファイルを読み取るワーカー スレッドを開始します。新しいデータの検出を慎重に実装する必要があります。これはパイプではなくファイルであるため、読み取り操作はファイルの終わりに到達すると単純に終了します。新しいデータが表示されるまでブロックされません。

Activity.runOnUiThread()次に、またはを使用してワーカー スレッドからHandler.post()メイン スレッドにデータを渡します。メイン スレッドでは、TextView のコンテンツを更新するために使用されます。

よりクリーンな方法は、パイプ ペアを作成し、パイプ ハンドルからファイル ハンドル値 1 ( )mkfifo()を使用して出力を所定の場所にリダイレクトすることです。これは、C/Linux の世界で通常行われている方法です。おそらくAndroidの例がそこにあるでしょうが、私はそれをやったことがありません.dup2()stdout

ああ、それをすべて行う前に、バイナリがより口当たりの良いインターフェイスを持っていないことを確認してください。多くの場合、Linux バイナリは静的/動的ライブラリに基づいており、そこにはすべての優れた機能があり、リンクして直接呼び出すことができます。

編集:特にそれがlogcat. Android でログを読み取る方法は他にもあります。

于 2012-10-01T15:37:39.250 に答える