我有一个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输出并在控制台中显示?
答案 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);
完成。