У меня есть Java-приложение, которое вызывает DLL, написанную на C ++ через JNI, и эта DLL динамически загружает другую DLL. Каким-то образом сообщения, записанные в cerr в C ++, появляются в некоторых случаях на некоторых компьютерах в Stdout-Stream части Java. Нет явного перенаправления любого из стандартных потоков (cerr, cout, Stdout, Sterr и т. Д.) Ни в части C ++, ни в части Java.
Как это может случиться? Как я могу гарантировать, что поток cerr уровня C ++ попадает в поток Stderr уровня Java?
JVM во всех случаях одинакова,
Версия JRE: 6.0_27-b07, Java VM: клиентская виртуальная машина Java HotSpot (TM) (смешанный режим 20.2-b06 windows-x86)
Чтобы ответить на ваш вопрос напрямую, std :: cerr может отображаться в System.out, только если они используют один и тот же дескриптор.
Если это действительно происходит на некоторых компьютерах, а не на других, я бы заподозрил различия в реализациях Java по умолчанию System.out и System.err. Вы не указали идентичные установки Java, просто разные компьютеры. Java не дает никаких гарантий относительно реализации потока вывода по умолчанию.
Теперь, поскольку буферизация и файловые дескрипторы на каждой стороне не скоординированы друг с другом, существуют только две возможности:
1) У вас есть доступ к источнику DLL и вы можете изменить все операции ввода-вывода, чтобы использовать передаваемые в System.out / err потоки Java.
2) Ты не. В этот момент, даже если вы, очевидно, добились успеха благодаря кооперативной очистке, вы не сможете доказать правильность, кроме экспериментальных доказательств того, что ваш хак работает. Существует высокая вероятность того, что эксперимент не выявит угловых случаев, когда буферы точно заполнены, пусты или когда они используют один и тот же файловый дескриптор.
Надеюсь, вы сможете выбрать # 1.
Других решений пока нет …