當Eclipse插件使用JNI時,如何將JNI控制台輸出重定向到Eclipse Console視圖?




plugins redirect (2)

我有一個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輸出並在控制台中顯示?


你不能,真的。 本機DLL使用無法從Java訪問的stdio方法。 如果您寫入System.out,Java運行時最終會使用相同的方法,但由於顯而易見的原因,更改System.out對C運行時的底層沒有影響。

有一個硬件解決方案:獲取第二個監視器,這樣您就可以看到始終啟動Eclipse的終端。


您可以嘗試使用freopen重定向stdout,方法與在Java中完全相同,但在本機方面。 問題是如果你在自己的插件中使用它(使用新的JNI dll)是否會有效:它可能需要在dll中使用控制台輸出,我不知道DLL之間的流之間的交互。 如果stdout指的是整個過程的共享流,那麼它可能會起作用。







jni