6

我有一个 Java 应用程序,它通过 JNI 调用一个用 C++ 编写的 DLL,然后这个 DLL 动态加载另一个 DLL。在某些情况下,在 Java 部分的 Stdout-Stream 中的某些计算机上,以某种方式写入 C++ 中的 cerr 的消息。无论是 C++ 部分还是 Java 部分,都没有任何标准流(cerr、cout、Stdout、Sterr 等)的显式重定向。

这怎么可能发生?如何确保 C++ 层的 cerr-stream 最终出现在 Java 层的 Stderr-stream 中?

JVM 在所有情况下都是一样的,

JRE 版本:6.0_27-b07,Java VM:Java HotSpot(TM) Client VM(20.2-b06 混合模式 windows-x86)

4

1 回答 1

2

要直接回答您的问题,如果 std::cerr 共享相同的描述符,它们只能显示在 System.out 中。

如果它真的发生在某些计算机上而不是其他计算机上,我怀疑默认 System.out 和 System.err 的 Java 实现存在差异。您没有指出相同的 Java 安装,只是不同的计算机。Java 不保证其默认的输出流实现。

现在,由于每一侧的缓冲和文件描述符彼此不协调,所以只存在两种可能性:

1) 您可以访问 DLL 源并且可以更改所有 I/O 以利用您传入的 System.out/err Java 流。

2)你没有。那时,即使您显然通过合作冲洗成功了,除了实验证据表明您的 hack 似乎有效之外,您也无法证明其正确性。很有可能实验不会发现缓冲区完全满、空或共享相同文件描述符的极端情况。

希望您能够选择#1。

于 2012-10-05T20:40:51.003 回答