Подтвердить что ты не робот

Как я могу перенаправить вывод консоли JNI в представление консоли Eclipse, когда плагин Eclipse использует JNI?

У меня есть плагин Eclipse (A), который имеет зависимость от другого плагина (B). Плагин B - это просто обертка вокруг банки, которая содержит родную DLL и выполняет 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));

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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