gpt4 book ai didi

java - cerr (c++) 怎么会出现在 Stdout (Java) 中?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:44:06 25 4
gpt4 key购买 nike

我有一个 Java 应用程序,它通过 JNI 调用用 C++ 编写的 DLL,然后这个 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) Client VM(20.2-b06 混合模式 windows-x86)

最佳答案

要直接回答您的问题,std::cerr 只能在共享相同描述符的情况下出现在 System.out 中。

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

现在,由于两边的缓冲和文件描述符不协调,只有两种可能:

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

2) 你不知道。在这一点上,即使你显然通过合作冲洗成功了,你也无法证明你的 hack 似乎有效的实验证据之外的正确性。实验很可能不会发现缓冲区恰好已满、空或共享相同文件描述符的极端情况。

希望你能选择#1。

关于java - cerr (c++) 怎么会出现在 Stdout (Java) 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12730518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com