2012-10-01 2 views
0

내 Android 응용 프로그램을 사용하여 원시 이진 파일을 실행하고 있습니다. 내 응용 프로그램의 작은 창에 해당 바이너리의 출력을 표시하고 싶습니다. TextView에서 출력을 표시하거나 작은 창 (선호)에 터미널을 표시하려면 어떻게해야합니까?TextView에 터미널 창 출력을 표시하는 방법

감사합니다.

+0

StackOverflow에 오신 것을 환영합니다. 문제가 정확히 무엇입니까? 변수를 출력으로 캡처하는 방법을 모르거나 윈도우에서 변수를 표시하는 방법을 모르십니까? 바로 사용할 준비가 된 완벽한 솔루션에 대한 요청은 일반적으로 여기서 무시되지 않습니다. 이를 위해 Rent-A-Coder가 존재합니다. –

+0

전체 코드 솔루션을 찾고 있지 않습니다. 제안 된 경로 또는 내 바이너리의 명령 줄 실행을 표시 할 수있는 Android SDK 패키지/메소드를 찾고 있습니다. – jbrew

+0

그것은 하나의 방법이 아니며 상당히 복잡합니다. 이 작업을 수행하는 가장 깨끗한 방법은 NDK 수준으로 떨어 뜨리는 것입니다. 이것이 없으면 중간 파일과 셸 수준 입력 리다이렉션을 사용할 수 있습니다. 나는 당신을 위해 후자를 스케치 할 것이다. –

답변

0

하나의 체계가 있습니다. NDK는 이것에 필요하지 않습니다.

앱의 데이터 디렉토리에 임시 파일을 만듭니다. Runtime.exec()을 사용하여 명령 행에서 출력 방향과 동일한 파일을 지정하여 2 진을 실행합니다. 지정해야하는 명령 행은 2 진 자체가 아닌 sh을 호출하며, 명령 행 매개 변수 중 하나는 재 지정이됩니다 : >myfile.txt.

그런 다음 동일한 파일을 읽는 작업자 스레드를 시작하십시오. 신중한 데이터 탐지를 신중하게 구현해야합니다. 파이프가 아닌 파일이므로 읽기 작업은 파일 끝에 도달하면 종료됩니다. 새로운 데이터가 나타날 때까지 차단되지 않습니다.

그런 다음 Activity.runOnUiThread() 또는 Handler.post()을 사용하여 작업자 스레드의 데이터를 주 스레드에 전달합니다.이 스레드는 TextView의 내용을 업데이트하는 데 사용됩니다.

mkfifo()으로 파이프 쌍을 만들고 파이프 핸들에서 dup2()을 사용하여 출력을 파일 핸들 값 1 (stdout)으로 리디렉션하는 것이 더 깨끗합니다. 이것이 그들이 C/Linux 세계에서 정상적으로하는 방법입니다. 아마도 안드로이드 예제가있을 것입니다.

아, 모든 것을하기 전에 바이너리가 더 맛있어 보이는 인터페이스가 없는지 확인하십시오. 흔히 리눅스 바이너리는 정적 인/동적 인 라이브러리를 기반으로하며, 맛있는 기능은 모두 링크되어 직접 호출 될 수 있습니다.

편집 : 특히 logcat 인 경우. Android에서 로그를 읽는 다른 방법이 있습니다. 자바는 Process.getOutputStream()/getErrorStream()를 통해 스트림으로

+0

감사합니다. 두 레벨의 인터페이스로 파일을 사용하는 것이 좋습니다.이 경우 libpcap과 libpthread가 사용되고 있지만 라이브러리에 존재하지 않는 바이너리에 필요한 다른 많은 기능이 있습니다. – jbrew

+0

답변으로 문제가 해결되면 수락하십시오. 여전히'mkfifo()/dup2()'애비뉴를 추구 할만한 가치가 있다고 생각하지만, 코드는 상당히 더 털이 나게 될 것입니다. 너까지. –

+0

임시 파일이 필요하지 않으며 파이프에 대해 걱정할 필요가 없으며 NDK를 파고들 필요가 없습니다. Java는 하위 프로세스의 출력을 캡처하기위한 깨끗하고 풍부한 메커니즘을 제공합니다 (예 : http://stackoverflow.com/questions/882772/capturing-stdout-when-calling-runtime-exec). –

1

알렉스가 연결되어있는 기사의 요점은 (도 stderr 등) Runtime.exec() 당신이 프로세스의 표준 출력을 얻을 수있는 Process 객체를 반환한다는 것입니다. 그 (것)들을 얻으십시오, 스레드에서 그들을 읽으십시오 (그들은 제대로 차단합니다 - 당신은 UI 스레드를 차단하고 싶지 않습니다), 다시 UI 스레드로 데이터를 전달하십시오. 훨씬 더. 나는 이전의 대답을 폐지합니다.

수 있도록이 문서에서는 BufferedReader 스트림을 배치하는 것이 좋습니다.

관련 문제