当Eclipse插件使用JNI时,如何将JNI控制台输出重定向到Eclipse Console视图?

时间:2010-10-24 14:32:20

标签: eclipse plugins redirect console java-native-interface

我有一个Eclipse插件(A),它依赖于另一个插件(B)。插件B只是一个jar包装器,它包含一个本机dll,并执行jni功能。 鉴于此设置,我在A的Activator类的start方法中有以下代码:

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输出并在控制台中显示?

3 个答案:

答案 0 :(得分:1)

您可以尝试使用freopen重定向stdout,方法与在Java中完全相同,但在本机方面。问题是,如果您在自己的插件中使用它(使用新的JNI dll)是否会起作用:它可能需要在执行控制台输出的dll中使用,我不知道DLL之间的流之间的交互。如果stdout指的是整个过程的共享流,那么它可能会起作用。

答案 1 :(得分:0)

你不能,真的。本机DLL使用无法从Java访问的stdio方法。如果您写入System.out,Java运行时最终会使用相同的方法,但由于显而易见的原因,更改System.out对C运行时的基础没有影响。

有一个硬件解决方案:获取第二个监视器,这样您就可以看到始终启动Eclipse的终端。

答案 2 :(得分:0)

例如Eclipse 2019-06 定期将 std::printf(...)std::cout 从 JNI 代码委托给控制台视图

刷新(=实际打印)由fflush(stdout);完成。