2012-08-03 5 views
2

짧은의 출력을 소모 자바에서 프로세스를 실행 : 자바에서 프로세스를 호출하고 출력이 JNI를 통해 호출되는 C++ 기능에 의해 소비 될 수있는 가장 좋은 방법은 무엇입니까.는 C++

: 에 대한 로그 판독기 응용 프로그램으로 실험 중입니다. Android. 이를 위해서는 logcat 명령을 실행하고 출력을 구문 분석해야합니다. 나는 에서 Java을 시도했지만 수행 된 메모리 할당량은 프로세스가 완전히 느려지지는 않을뿐만 아니라 매우 많은 로그가 동일한 로그를 GC 관련 항목과 겹치게합니다.

그 이유로 저는 모든 구문 분석 관련 연산을 C++에 구현했습니다. 그러나, 보통 fork/exec 관용구를 사용하여 C++ 쪽에서 을 호출 할 때는 NDK으로 실제로 지원되지 않습니다. 대신, 내가 에서 Java의 프로세스를 시작하고 어떤 식 으로든 C++ 코드에 해당 출력을 액세스 할 수있게해야합니다. 이상적으로는이 파이프를 사용하지만 ProcessBuilderredirectOutput 메소드는 에서 안드로이드 중 하나에서 사용할 수 없습니다.

내가 지금까지 함께 온 가장 좋은 방법은 (logcat > tempfile를 사용하여) 임시 파일에 출력을 리디렉션 프로세스를 시작하고, 그 파일에서 읽은 C++ 코드를 가지고있다. 그러나 이것은 이상과는 거리가 멀다. 거기에 더 나은 방법은 네이티브 코드에서 프로세스의 출력에 액세스 할 수 있습니다 에서 시작 자바?

답변

3

당신의 전제는 약간 잘못되었습니다 : fork/exec()는 안드로이드에서 NDK를 통해 수행 할 때보 다 더 이상 "적절합니다"입니다 - 두 경우 모두 현재 작동하지만 외부의 것으로 간주됩니다 way 안드로이드 앱이 작동해야합니다.

로그를 읽는 것이 또 다른 경계선입니다. JellyBean의 경우 자신 만의 (프로세스 또는 사용자 ID, 확실하지 않은) 메시지를 읽을 수 있습니다. ADB 명령은 특정 응용 프로그램이 이전 릴리스 에서처럼 모든 로그를 읽을 수 있도록하지만 ADB에서 발행해야합니다. ADB 명령은 응용 프로그램에서 설정할 수 없습니다.

필요성과 임박한 유틸리티의 한계에 관계없이 말한 것을 문자 그대로 그대로 나타내려면, 자식 프로세스에 연결하는 파일 설명 자에 대한 지식을 원시 코드로 가져 오는 것이 좋습니다. 이것을 전달할 수도 있고 네이티브 코드가 모든 파일 기술자가/proc에 나열되기 때문에 네이티브 코드가 그것을 발견 할 수도 있습니다.

+0

모두 좋은 점입니다. 4.1에서 소개 된 제한 사항을 알지 못했습니다. Dalvik이 NDK에서 프로세스를 시작하는 문제는 Dalvik이 해당 프로세스에 대해 알지 못한다는 것이 었습니다. –