2010-10-24 28 views
24

我有一個Eclipse插件(A),它依賴於另一個插件(B)。插件B只是一個jar包的包裝,它包含一個本地dll,並執行jni功能。 鑑於此設置,我有一個的Activator類的start方法如下代碼:當Eclipse插件使用JNI時,如何將JNI控制檯輸出重定向到Eclipse Console視圖?

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輸出並在控制檯中顯示呢?

+2

什麼函數在本地代碼中記錄消息? printf,fprintf,puts?...你可以自由地重寫代碼,改變日誌記錄功能嗎? – 2010-12-13 15:20:14

+0

由於涉及JNI:便攜式應該如何成爲解決方案?至少在什麼平臺上工作? – 2011-10-09 11:07:37

回答

0

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

有一個硬件解決方案:獲取第二臺顯示器,以便您可以始終查看您啓動Eclipse的終端。

1

您可以嘗試使用freopen重定向標準輸出,方式與您在Java中完全相同,但在本機方面。問題是,如果你在你自己的插件中使用它(用一個新的JNI dll)它是否會工作:它可能需要從dll內部使用控制檯輸出,我不知道跨DLL的流之間的交互。如果stdout引用整個進程的共享流,也許它會工作。

相關問題