如何使用 JNI 将终端输出从 C 程序重定向到 System.out?

发布于 2024-07-09 13:03:43 字数 60 浏览 11 评论 0原文

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

I am invoking a C library via JNI that prints to stdout. How can I redirect this output to System.out?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

长梦不多时 2024-07-16 13:03:43

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

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

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

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

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

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

System.out is stdout. Is there some more fundamental problem you're having (mixed up output, perhaps?).

Since another member has also mentioned that last point - I should explain further:

System.out and stdout both correspond to file descriptor #1.

However both Java's OutputStream (and derived classes) and C's stdio library have their own (independent) buffering mechanisms so as to reduce the number of calls to the underlying write system call. Just because you've called printf or similar, it's not guaranteed that your output will appear straightaway.

Because these buffering methods are independent, output from within Java code could (in theory) get mixed up or otherwise appear out-of-order relative to output from the C code.

If that's a concern, you should arrange to call System.out.flush() before calling your JNI function, and in your C function (if it's using stdio rather than the low-level write call) you should call fflush(stdout) before returning.

相权↑美人 2024-07-16 13:03:43

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

As Alnitak wrote, you should print to stdout. You should note that it can take a while for the message to appear on the screen. In case the timing is important, you should print a timestamp with the message when you print to stdout.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文