【问题标题】:How do I redirect terminal output from a C program to System.out with JNI?如何使用 JNI 将终端输出从 C 程序重定向到 System.out?
【发布时间】:2008-11-14 17:08:39
【问题描述】:

我正在通过 JNI 调用一个 C 库,该库打印到标准输出。如何将此输出重定向到 System.out?

【问题讨论】:

    标签: java c java-native-interface stdout


    【解决方案1】:

    System.out stdout。您是否遇到了一些更根本的问题(可能是混淆了输出?)。

    由于另一位成员也提到了最后一点 - 我应该进一步解释:

    System.outstdout 都对应文件描述符#1。

    然而,Java 的OutputStream(和派生类)和C 的stdio 库都有自己的(独立的)缓冲机制,以减少对底层write 系统调用的调用次数。仅仅因为您调用了printf 或类似名称,并不能保证您的输出会立即出现。

    由于这些缓冲方法是独立的,Java 代码中的输出可能(理论上)会混淆,或者相对于 C 代码的输出出现乱序。

    如果这是一个问题,您应该安排在调用 JNI 函数之前调用 System.out.flush(),并且在您的 C 函数中(如果它使用 stdio 而不是低级 write 调用)您应该调用 @987654332 @返回之前。

    【讨论】:

    • 是的,但是如果您在 JVM 中更改 System.out 变量并调用本机 C 代码,则 C 方法的输出仍将写入终端,而您的 java 输出可能会定向到其他地方。如果您知道解决方法,请告诉我。
    【解决方案2】:

    正如 Alnitak 所写,您应该打印到标准输出。您应该注意,消息可能需要一段时间才能出现在屏幕上。如果时间很重要,您应该在打印到标准输出时打印带有消息的时间戳。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-11
      • 1970-01-01
      • 1970-01-01
      • 2021-01-27
      • 1970-01-01
      • 2017-12-01
      • 2012-10-30
      • 1970-01-01
      相关资源
      最近更新 更多