【发布时间】:2008-11-14 17:08:39
【问题描述】:
我正在通过 JNI 调用一个 C 库,该库打印到标准输出。如何将此输出重定向到 System.out?
【问题讨论】:
标签: java c java-native-interface stdout
我正在通过 JNI 调用一个 C 库,该库打印到标准输出。如何将此输出重定向到 System.out?
【问题讨论】:
标签: java c java-native-interface stdout
System.out 是 stdout。您是否遇到了一些更根本的问题(可能是混淆了输出?)。
由于另一位成员也提到了最后一点 - 我应该进一步解释:
System.out 和stdout 都对应文件描述符#1。
然而,Java 的OutputStream(和派生类)和C 的stdio 库都有自己的(独立的)缓冲机制,以减少对底层write 系统调用的调用次数。仅仅因为您调用了printf 或类似名称,并不能保证您的输出会立即出现。
由于这些缓冲方法是独立的,Java 代码中的输出可能(理论上)会混淆,或者相对于 C 代码的输出出现乱序。
如果这是一个问题,您应该安排在调用 JNI 函数之前调用 System.out.flush(),并且在您的 C 函数中(如果它使用 stdio 而不是低级 write 调用)您应该调用 @987654332 @返回之前。
【讨论】:
System.out 变量并调用本机 C 代码,则 C 方法的输出仍将写入终端,而您的 java 输出可能会定向到其他地方。如果您知道解决方法,请告诉我。
正如 Alnitak 所写,您应该打印到标准输出。您应该注意,消息可能需要一段时间才能出现在屏幕上。如果时间很重要,您应该在打印到标准输出时打印带有消息的时间戳。
【讨论】: