6

JNIを介してC++で記述されたDLLを呼び出すJavaアプリケーションがあります。このDLLは、別のDLLを動的にロードします。どういうわけか、C ++でcerrに書き込まれたメッセージは、Java部分のStdout-Stream内の一部のコンピューターで表示される場合があります。C ++部分でもJava部分でも、標準ストリーム(cerr、cout、Stdout、Sterrなど)の明示的なリダイレクトはありません。

これはどのように起こりますか?C ++レイヤーのcerr-streamがJavaレイヤーのStderr-streamに含まれるようにするにはどうすればよいですか?

JVMはすべての場合で同じであり、

JREバージョン:6.0_27-b07、Java VM:Java HotSpot(TM)クライアントVM(20.2-b06混合モードwindows-x86)

4

1 に答える 1

2

質問に直接答えるために、 std::cerr は、同じ記述子を共有している場合にのみ System.out に表示されます。

一部のコンピューターで実際に発生し、他のコンピューターでは発生しない場合は、デフォルトの System.out と System.err の Java 実装に違いがあるのではないかと思います。同一の Java インストールを示したのではなく、異なるコンピューターを示しただけです。Java は、デフォルトの出力ストリームの実装について保証しません。

ここで、両側のバッファリングとファイル記述子が互いに調整されていないため、次の 2 つの可能性しかありません。

1) DLL ソースにアクセスでき、渡された System.out/err Java ストリームを利用するようにすべての I/O を変更できます。

2) あなたはしません。その時点で、協力的なフラッシュで明らかに成功したとしても、ハッキングが機能しているように見えるという実験的証拠を超えて、正確さを証明することはできません。実験では、バッファーが完全に満杯、空、または同じファイル記述子を共有しているという稀なケースが明らかにならない可能性が十分にあります。

うまくいけば、#1を選択できます。

于 2012-10-05T20:40:51.003 に答える