2010-10-24 2 views
24

У меня есть плагин Eclipse (A), который имеет зависимость от другого плагина (B). Плагин B - это просто обертка вокруг банки, которая содержит родную DLL и выполняет jni-функциональность. Учитывая эту установку, у меня есть следующий код в методе начать в Активатор класса:Как я могу перенаправить вывод консоли JNI в представление консоли Eclipse, когда плагин Eclipse использует JNI?

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)); 

Когда плагин выполняет свои функции, любое использование System.out на самом деле идет на консоли в Eclipse. Но встроенный код, используемый JNI, также записывается в выходной поток, который я не могу захватить. Во время разработки вывод JNI поступает на консоль экземпляра Eclipse, который запустил исполняемый экземпляр, который содержит плагины.

Как я могу получить вывод JNI и отображение в консоли?

+2

Какая функция (ы) записывает сообщения в собственный код? printf, fprintf, puts? ... Не могли бы вы переписать код, изменив функцию ведения журнала? –

+0

С JNI: насколько переносимым должно быть решение? На каких платформах он должен работать хотя бы? –

ответ

0

Вы не можете, действительно. В родной DLL используются методы stdio, с которыми вы не можете получить доступ с Java. Если вы пишете в System.out, среда выполнения Java в конечном итоге использует те же методы, но по понятным причинам изменения System.out не влияют на базовую среду выполнения C.

Существует аппаратное решение: получите второй монитор, чтобы вы могли видеть терминал, на котором вы все время запускали Eclipse.

1

Вы можете попробовать использовать freopen для перенаправления stdout точно так же, как на Java, но с внутренней стороны. Вопрос в том, будет ли это работать, если вы использовали его в своем собственном плагине (с новой dll JNI): его, возможно, придется использовать из DLL, выполняющего вывод консоли, я не знаю, как взаимодействовать между потоками через DLL , Если stdout ссылается на общий поток для всего процесса, возможно, он сработает.