如何解决使用Java从方法调用中读取C ++控制台输出
当前,当有方法调用时,我试图读取程序的控制台输出。它的工作方式是,我的Java程序调用JNI包装器来调用C ++方法调用。我的C ++使用std::cout
。 payload.invoke
将调用我的c ++库API。在c ++ API中,有一些cout语句。那是我想将其作为Java变量读取的语句。
当前的PrintStream
仅支持out,print,println and printf
。每次调用方法时,都会在命令提示符下打印出许多日志。现在,我希望我的Java程序读取我的C ++打印出来的输出。
这是我当前的Java代码:
public void execute() {
try {
Matcher m = Pattern.compile("([^()]*)[(]([^()]*)[)]").matcher(getPayloadString());
m.find();
boolean passed;
if (m.group(2).isEmpty()) {
// this is where it invoke the method
passed = (boolean) payload.invoke(testcase);
System.out.println("Boolean is: " + passed + "\n");
}else {
passed = (boolean) payload.invoke(testcase,ObjectCreator.convertParameters(m.group(2)));
System.out.println("Boolean2 is: " + passed + "\n");
}
String output = passed ? "PASS" : "FAIL";
// I want to use the console output string variable here -> xxxx
TestCase.printResult(payload.getName(),output,m.group(2),xxxx,"");
} catch (Exception ex) {
ex.printStackTrace();
}
}
有什么方法可以做到吗?以前,我尝试使用here中的教程之一。但这似乎不起作用。有人可以帮我这个忙吗?预先感谢。
解决方法
如果您完全控制.cpp代码库,则可以将std :: cout更改为ostream&。
通过引用基类,您可以轻松切换实现。
执行一个JNI-Stream,它扩展了ostream&并且只是覆盖了将JNI包装的回调发送给Java所需的运算符。
然后根据您运行的是本机样式还是Java样式,使用JNI-Stream而不是std :: cout。
我会做下面的链接中所述的操作,以打包并将数据发送到Java:
JNI - How to callback from C++ or C to Java?
那是我的2美分。
,仔细阅读JNI教程。
按照教程进行。 基本上,您需要创建一个带有静态块的Java类来加载C ++库:
static {
System.loadLibrary("native");
}
然后,您可以创建自己的静态java方法并在库上调用方法。
如果您需要从系统调用中读取输出,则情况有所不同。 这可以帮助您:
Java Runtime.getRuntime(): getting output from executing a command line program
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。