2013-10-09 30 views
2

我有C++的DLL运行一个Java程序使用JNI,我想弄清楚如何捕获该Java程序的输出。我试过使用一个stringstream将stdout重定向到一个缓冲区,但这似乎只抓取来自我的dll的输出。我能做些什么来读取System.out?如何使用JNI将System.out从Java传递到C?

这就是我想现在,它不工作:

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

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

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

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

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

+0

我遇到同样的问题 - 只有我用printf()打印的东西被重定向到文件。 –

+0

然后JVM重新打开stdin ......有趣的问题,我会再试着想一想。我认为你必须首先在Java方面进行破解 – Geoffroy

相关问题