【问题标题】:How do I pass System.out from Java to C using JNI?如何使用 JNI 将 System.out 从 Java 传递到 C?
【发布时间】:2013-10-09 23:23:02
【问题描述】:

我有使用 JNI 运行 java 程序的 C++ dll,我正在尝试弄清楚如何捕获该 java 程序的输出。我尝试使用字符串流将标准输出重定向到缓冲区,但这似乎只获取来自我的 dll 的输出。我可以在 System.out 中阅读哪些内容?

这是我现在正在尝试的,但不起作用:

using namespace std;

stringstream buffer;
streambuf * old = cout.rdbuf(buffer.rdbuf());
//run java stuff here

在我这样做之后,buffer.str() 仍然是空的,即使 java 方法正确执行并且在这些方法中有 System.out.println() 调用。如果我执行cout << "test" << endl; 之类的操作,buffer.str() 会获取该文本,因此缓冲区似乎没有问题。我在这里有什么选择?

【问题讨论】:

    标签: java c++ java-native-interface


    【解决方案1】:

    通过修改cout缓冲区,你并没有修改标准输出流,只是用来封装它的对象。

    要完全重定向输出,您必须将freopen stdout 到文件或管道,您可以在此question 中获取更多信息。

    然后要获得完整的java代码输出,你可以在阅读模式下打开同一个文件(或管道),然后简单地得到你想要的信息。

    顺便说一句,在您的代码示例中,您不需要stringstream,而只需要关联的stringbuf 否?

    【讨论】:

    • 我遇到了同样的问题 - 只有我使用 printf() 打印的内容被重定向到文件。
    • 然后JVM重新打开stdin...有趣的问题,我明天再考虑一下。我认为你必须先在 Java 端破解它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多