2 Stimmen

Ausführen eines Prozesses in Java und Konsumieren der Ausgabe in C++

Kurz : Wie kann man einen Prozess am besten von Java und dessen Ausgabe von einem C++ Funktion, die über JNI .

Lang : Ich experimentiere mit einer Log-Reader-Anwendung für Android . Dazu muss ich die logcat Befehl und analysiert dessen Ausgabe. Ich habe dies versucht von Java aber die Menge der durchgeführten Speicherzuweisungen ist so groß, dass der Prozess nicht nur sehr langsam ist, sondern auch das Protokoll mit vielen Daten überfüllt. GC verwandte Einträge.

Aus diesem Grund habe ich alle mit dem Parsing verbundenen Operationen in C++ . Ich kann jedoch nicht die übliche fork/exec Redewendung zum Aufrufen logcat von der C++ Seite, da sie nicht wirklich von der NDK . Stattdessen muss ich den Prozess von vorne beginnen Java und machen Sie die Ausgabe irgendwie zugänglich für die C++ Code. Idealerweise würde ich dafür eine Pipe verwenden, aber die redirectOutput Methoden aus ProcessBuilder sind nicht verfügbar auf Android entweder.

Die beste Lösung, die ich bisher gefunden habe, ist, den Prozess zu starten und seine Ausgabe in eine temporäre Datei umzuleiten (mit logcat > tempfile ), und haben die C++ Code aus dieser Datei gelesen. Dies ist jedoch alles andere als ideal. Gibt es eine bessere Möglichkeit, nativen Code auf die Ausgabe eines Prozesses zugreifen zu lassen, der von Java ?

3voto

Chris Stratton Punkte 39229

Ihre Prämisse ist ein wenig falsch: fork/exec() ist auf Android nicht "richtiger", wenn es von Java aus ausgeführt wird, als wenn es über das NDK ausgeführt wird - in beiden Fällen funktioniert es heute, aber es wird als außerhalb der Art und Weise betrachtet, wie Android-Anwendungen funktionieren sollen.

Das Lesen der Logs ist ein weiterer Grenzfall: Seit JellyBean kann man nur noch seine eigenen Nachrichten lesen (Prozess oder Userid, bin mir nicht sicher, welche). Es gibt einen ADB-Befehl, der verwendet werden kann, um einer bestimmten App zu ermöglichen, alle Protokolle zu lesen, wie in früheren Versionen, aber das muss von der ADB ausgegeben werden - es kann nicht von einer App eingerichtet werden.

Wenn Sie buchstäblich das tun wollen, was Sie gesagt haben, ungeachtet der fehlenden Notwendigkeit und der drohenden Einschränkung der Nützlichkeit, müssten Sie die Dateideskriptoren, die mit dem Kindprozess verbunden sind, in den nativen Code einbringen. Vielleicht können Sie sie übergeben, oder der native Code kann sie selbst herausfinden, da alle Dateideskriptoren in /proc aufgeführt sind.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X