2012-10-04 33 views
6

我有一個Java應用程序調用通過JNI用C++編寫的DLL,然後這個DLL動態加載另一個DLL。不知何故,在Java部分的Stdout-Stream中的某些計算機上,某些情況下,用C++寫入cerr的消息會出現。在C++部分和Java部分中,沒有任何標準流(cerr,cout,Stdout,Sterr等)的明確重定向。如何在stdout(Java)中啓動cerr(C++)?

這是怎麼發生的?我怎樣才能確保C++層的cerr-stream在Java層的Stderr流中結束?

JVM是在所有情況下是相同的,

JRE版本:6.0_27-B07,Java虛擬機:爪哇的HotSpot(TM)客戶機VM(20.2-B06混合模式窗口86)

+2

大概這可能是由於JVM在'C++' –

+2

@SriHarshaChilakapati中實現的原因爲什麼這麼重要? – user93353

+0

由於JVM是在'C++'中實現的,因此Java層將位於C++層的頂層。所以我認爲這可能是因爲Java Layer正在讀取打印C++消息的控制檯時發生的。這也可能發生,因爲JVM發佈的'jni dll'發佈的錯誤正在被JVM監控。 –

回答

2

要直接回答你的問題,std :: cerr只能在System.out中顯示,如果它們共享相同的描述符。

如果它確實發生在某些計算機上而不是其他計算機上,我會懷疑默認System.out和System.err的Java實現有所不同。您沒有指出完全相同的Java安裝,只是不同的計算機。 Java不保證其默認輸出流實現。現在

,因爲每邊的緩衝和文件描述符不協調彼此,只有兩種可能:

1)你可以訪問DLL源,並且可以改變所有的I/O利用你傳遞在System.out/err Java流中。

2)你沒有。在那個時候,即使你顯然通過合作沖洗取得成功,但你不能證明你的黑客似乎有效的實驗證據之外的正確性。有一個很好的機會,實驗不會發現緩衝區完全滿,空白或共享相同文件描述符的情況。

希望你能選擇#1。