Как я могу перенаправить вывод консоли 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 в консоли?
Ответы
Ответ 1
Вы можете попробовать freopen перенаправить stdout точно так же, как на Java, но на родной стороне. Вопрос в том, будет ли это работать, если вы использовали его в своем собственном плагине (с новой dll JNI): его, возможно, придется использовать из DLL, выполняющего вывод консоли, я не знаю, как взаимодействовать между потоками через DLL, Если stdout ссылается на общий поток для всего процесса, возможно, он будет работать.
Ответ 2
Ты не можешь, правда. В родной DLL используются методы stdio, с которыми вы не можете получить доступ с Java. Если вы пишете в System.out, среда выполнения Java в конечном итоге использует те же методы, но по очевидным причинам изменения System.out не влияют на базовую среду выполнения C.
Существует аппаратное решение: получите второй монитор, чтобы вы могли видеть терминал, на котором вы все время запускали Eclipse.