Tim*_*eek 6 c++ java java-native-interface
我有一个Java应用程序通过JNI调用用C++编写的DLL,然后这个DLL动态加载另一个DLL.在某些情况下,在Java部分的Stdout-Stream中的某些计算机上,以某种方式在C++中写入cerr的消息会出现.在C++部分和Java部分中都没有显式重定向任何标准流(cerr,cout,Stdout,Sterr等).
怎么会发生这种情况?如何确保C++层的cerr-stream最终出现在Java层的Stderr流中?
JVM在所有情况下都是相同的,
JRE版本:6.0_27-b07,Java VM:Java HotSpot(TM)客户端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)你不知道。到那时,即使你通过合作刷新显然成功了,除了实验证据表明你的黑客似乎有效之外,你也无法证明正确性。实验很可能不会发现缓冲区完全满、空或共享相同文件描述符的极端情况。
希望你能够选择#1。
| 归档时间: |
|
| 查看次数: |
841 次 |
| 最近记录: |