Android アプリを使用してネイティブ バイナリを起動しています。そのバイナリの出力をアプリケーションの小さなウィンドウに表示したいと思います。出力を TextView に表示するか、ターミナルを小さなウィンドウに表示するにはどうすればよいですか (推奨)。
ありがとう。
Android アプリを使用してネイティブ バイナリを起動しています。そのバイナリの出力をアプリケーションの小さなウィンドウに表示したいと思います。出力を TextView に表示するか、ターミナルを小さなウィンドウに表示するにはどうすればよいですか (推奨)。
ありがとう。
アレックスがリンクした記事の要点はRuntime.exec()
、オブジェクトを返すProcess
ことです。これにより、プロセスの標準出力 (およびstderr
も) を Java 経由でストリームとして取得できますProcess.getOutputStream()/getErrorStream()
。それらを取得し、スレッドで読み取り (適切にブロックします。UI スレッドをブロックしたくありません)、データを UI スレッドに戻します。はるかに優れています。以前の回答を取り消します。
この記事では、ストリームを でラップすることも推奨してBufferedReader
いますreadLine
。
これが1つのスキームです。これには NDK は必要ありません。
アプリのデータ ディレクトリに一時ファイルを作成します。を使用して、コマンド ラインで出力方向として同じファイルを指定して、バイナリを実行しますRuntime.exec()
。指定する必要があるコマンド ラインは、バイナリ自体ではなく を呼び出します。またsh
、コマンド ライン パラメータの 1 つはリダイレクト:>myfile.txt
です。
次に、同じファイルを読み取るワーカー スレッドを開始します。新しいデータの検出を慎重に実装する必要があります。これはパイプではなくファイルであるため、読み取り操作はファイルの終わりに到達すると単純に終了します。新しいデータが表示されるまでブロックされません。
Activity.runOnUiThread()
次に、またはを使用してワーカー スレッドからHandler.post()
メイン スレッドにデータを渡します。メイン スレッドでは、TextView のコンテンツを更新するために使用されます。
よりクリーンな方法は、パイプ ペアを作成し、パイプ ハンドルからファイル ハンドル値 1 ( )mkfifo()
を使用して出力を所定の場所にリダイレクトすることです。これは、C/Linux の世界で通常行われている方法です。おそらくAndroidの例がそこにあるでしょうが、私はそれをやったことがありません.dup2()
stdout
ああ、それをすべて行う前に、バイナリがより口当たりの良いインターフェイスを持っていないことを確認してください。多くの場合、Linux バイナリは静的/動的ライブラリに基づいており、そこにはすべての優れた機能があり、リンクして直接呼び出すことができます。
編集:特にそれがlogcat
. Android でログを読み取る方法は他にもあります。