如何使用JNI将System.out从Java传递到C?

时间:2013-10-09 23:23:03

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

我有使用JNI运行java程序的C ++ DLL,我正在试图弄清楚如何捕获该java程序的输出。我已经尝试使用stringstream将stdout重定向到缓冲区,但这似乎只是抓住来自我的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()会获取该文本,因此它似乎不是缓冲区的问题。我有什么选择?

1 个答案:

答案 0 :(得分:1)

通过修改cout缓冲区,您没有修改标准输出流,只修改了用于封装它的对象。

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

然后,要获得java代码的完整输出,您可以在阅读模式下打开相同的文件(或管道),只需获取所需的信息。

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