2010-10-24 4 views
24

Ich habe ein Eclipse-Plugin (A), das von einem anderen Plugin (B) abhängig ist. Plugin B ist einfach ein Wrapper um ein Jar, der eine native DLL enthält und jni-Funktionalität ausführt. dieses Setup gegeben, ich habe den folgenden Code in A der Start-Methode des Activator Klasse:Wie kann ich die Ausgabe der JNI-Konsole in die Eclipse-Konsolenansicht umleiten, wenn das Eclipse-Plugin JNI verwendet?

MessageConsole jniConsole = new MessageConsole("Opereffa Output", null); 
ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[] { jniConsole }); 
ConsolePlugin.getDefault().getConsoleManager().showConsoleView(jniConsole); 
MessageConsoleStream stream = jniConsole.newMessageStream(); 
System.setOut(new PrintStream(stream)); 
System.setErr(new PrintStream(stream)); 

Wenn Plugin A seine Funktionalität durchführt, jegliche Verwendung von System.out geht tatsächlich auf die Konsole innerhalb von Eclipse. Aber der von JNI verwendete native Code schreibt auch in den Ausgabestream, den ich nicht erfassen kann. Während der Entwicklung geht die Ausgabe von JNI zur Konsole der Eclipse-Instanz, die die laufende Instanz gestartet hat, die die Plugins enthält.

Also wie greife ich den JNI-Ausgang und Anzeige in der Konsole?

+2

Welche Funktion (en) protokollieren Nachrichten im systemeigenen Code? printf, fprintf, puts? ... Wären Sie in der Lage, den Code neu zu schreiben und die Logging-Funktion zu ändern? –

+0

Da JNI beteiligt ist: Wie portabel muss eine Lösung sein? Auf welchen Plattformen sollte es mindestens funktionieren? –

Antwort

0

Sie können nicht, wirklich. Die native DLL verwendet STDIO-Methoden, auf die Sie nicht über Java zugreifen können. Wenn Sie in System.out schreiben, verwendet die Java-Laufzeit möglicherweise die gleichen Methoden, aber aus offensichtlichen Gründen haben Änderungen an System.out keinen Einfluss auf die C-Laufzeit.

Es gibt eine Hardware-Lösung: Holen Sie sich einen zweiten Monitor, damit Sie das Terminal sehen können, in dem Sie Eclipse die ganze Zeit gestartet haben.

1

Sie könnten versuchen, mit freopen stdout auf die gleiche Weise umleiten wie Sie in Java, aber auf der nativen Seite. Die Frage ist, ob dies funktioniert, wenn Sie es in Ihrem eigenen Plugin (mit einer neuen JNI-DLL) verwenden: Es muss möglicherweise innerhalb der DLL verwendet werden, die Konsolenausgabe, ich habe keine Ahnung von der Interaktion zwischen Streams über DLLs . Wenn sich stdout auf einen freigegebenen Stream für den gesamten Prozess bezieht, würde es vielleicht funktionieren.

Verwandte Themen