cerr(c++)如何在Stdout(Java)中出现
How can cerr (c++) turn up in Stdout (Java)?
我有一个Java应用程序,它通过JNI调用用C++编写的DLL,然后这个DLL动态加载另一个DLL。在某些情况下,用C++编写到cerr的消息会出现在Java部分的Stdout流中的某些计算机上。C++部分和Java部分中都没有任何标准流(cerr、cout、Stdout、Sterr等)的显式重定向。
这怎么会发生?如何确保C++层的cerr流最终在Java层的Stderr流中?
JVM在所有情况下都是相同的,
JRE版本:6.0_27-b07,Java虚拟机:Java HotSpot(TM)客户端虚拟机(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) 你没有。在这一点上,即使你显然通过合作冲洗成功了,你也无法证明你的破解似乎有效的实验证据之外的正确性。实验很有可能不会发现缓冲区完全满、空或共享相同文件描述符的情况。
希望你能选择#1。
相关文章:
- 如何将stdout重定向到stderr
- 在java中解决这段代码时面临循环中的问题
- 尝试用java代码编译和运行c++代码
- 在这种情况下,java对象是否可以调用本机函数
- 在java中读取c++字节的位字段
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 使用已使用 java 编码的 openssl 解码数据
- SWIG Java 在使用 -DSWIGWORDSIZE64 时将int64_t转换为 jlong
- Android Java USB for native cpp
- 在由Sublime文本3编译后在cmd上显示Java程序输出
- C++ equivalent to Java Map getOrDefault?
- C++ 中的 Java 样式枚举
- 是否有技术原因阻止 Java 中的 final C++ 像 const 一样严格?
- 加密在 Windows、C++ 和 Java 中传输中的数据
- Java从C++回调到C++回调
- 在 c++ 中模拟输入并在 JAVA 中读取它?
- 用C++包装 Java 库 (JNI)
- 使用 TreeSet Java 对反转进行计数
- 验证openssl c++中的签名,这是由JAVA DSA签名的?
- cerr(c++)如何在Stdout(Java)中出现