【问题标题】:Read c++ console output from method call using Java使用 Java 从方法调用中读取 c++ 控制台输出
【发布时间】:2020-10-20 09:33:43
【问题描述】:

目前,当有方法调用时,我正在尝试读取程序的控制台输出。它的工作原理是,我的 Java 程序调用 JNI 包装器来调用 C++ 方法调用。我的 C++ 正在使用std::coutpayload.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 的教程之一。但这似乎不起作用。有人可以帮我解决这个问题吗?提前致谢。

【问题讨论】:

  • @Fecid 我不太确定,因为我刚刚经历过,但我不确定如何使用它,因为该链接基于 system.out 输出。
  • 在打印之前将所有输出存储在一个变量中就足够了吗?然后你就可以读取这些存储的值了。
  • 如果您在代码中看到,我没有使用 System.out 或 print()。我正在使用.invoke 以编程方式调用该方法。我不确定如何在调用方法被触发时捕获输出?
  • @RaajLokanathan,是的,这就是我的想法。另一种选择是将本机代码打印到std::stringstream,然后从该函数返回std::stringstream::str()

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


【解决方案1】:

如果您完全控制 .cpp 代码库,则可以将 std::cout 更改为 ostream&。

通过引用基类,您可以轻松切换实现。

做一个扩展 ostream& 的 JNI-Stream 并覆盖您需要将 JNI 包装的回调发送到 java 的运算符。

然后根据你是运行原生还是 Java 风格,使用你的 JNI-Stream 而不是 std::cout。

我会按照下面的链接做一些事情来打包数据并将其发送到 Java:

JNI - How to callback from C++ or C to Java?

那是我的 2 美分。

【讨论】:

    【解决方案2】:

    仔细阅读 JNI 教程。

    https://www.baeldung.com/jni

    按照教程进行操作。 基本上你需要创建一个带有静态块的java类来加载C++库:

    static {
        System.loadLibrary("native");
    }
    

    然后您可以创建自己的静态 java 方法并调用库上的方法。

    如果您需要的是读取系统调用的输出,那就另当别论了。 这可以帮助您:

    Java Runtime.getRuntime(): getting output from executing a command line program

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-12
      • 2016-06-05
      相关资源
      最近更新 更多