Как перенаправить вывод терминала из программы на C в System.out с помощью JNI? - PullRequest
4 голосов
/ 14 ноября 2008

Я вызываю библиотеку C через JNI, которая печатает на стандартный вывод. Как я могу перенаправить этот вывод в System.out?

Ответы [ 2 ]

8 голосов
/ 14 ноября 2008

System.out - stdout. Есть ли у вас более фундаментальная проблема (возможно, перепутали результаты?).

Так как другой член также упомянул этот последний момент - я должен объяснить далее:

System.out и stdout оба соответствуют дескриптору файла № 1.

Однако и Java OutputStream (и производные классы), и библиотека C stdio имеют свои собственные (независимые) механизмы буферизации, чтобы уменьшить количество вызовов базового системного вызова write. Просто потому, что вы позвонили printf или тому подобное, не гарантируется, что ваш вывод будет отображаться сразу.

Поскольку эти методы буферизации являются независимыми, выходные данные из Java-кода могут (теоретически) быть перепутаны или иначе отображаться не по порядку относительно выходных данных из кода C.

Если это вызывает озабоченность, вы должны договориться о вызове System.out.flush() перед вызовом вашей функции JNI, и в вашей функции C (если она использует stdio вместо низкоуровневого write вызова), вы должны вызвать fflush(stdout) до возвращения.

1 голос
/ 15 ноября 2008

Как писал Альнитак, вы должны печатать на стандартный вывод. Обратите внимание, что сообщение может появиться на экране в течение некоторого времени. Если время имеет важное значение, вы должны распечатать временную метку с сообщением при печати на стандартный вывод.

...