gpt4 book ai didi

java - 如何在 JNI 中从 C++ 调用 Java 方法

转载 作者:行者123 更新时间:2023-11-30 00:59:42 27 4
gpt4 key购买 nike

所以我正在编写一个使用大型 C++ 库的 Android 应用程序。我的一切正常,因此 java 应用程序可以调用 c++ 委托(delegate)方法,但我发现自己希望我可以将消息从 c++ 记录到 Android 日志。这在 java 中很容易,但我不知道如何从 c++ 调用 java 方法。我的搜索找到了从 C++ 打开 jvm 的方法,这根本不是我想要做的。理想情况下,我想将一个日志方法指针传递给 c++,然后我可以随时使用它。当然,java不支持方法指针。我的 java 方法看起来像这样:

private void log(String s){
Log.i(Tag, s); // Android log
}

我只是不知道如何让c++访问这个方法。

最佳答案

C++ 对 coutprintf 的调用不会在 LogCat 输出中显示。有两种解决方案。

  1. 使用 NDK 提供的日志记录宏,允许您将消息记录到 LogCat。这对您正在编写的新代码和包装器代码很有用,但当您拥有一个充满现有调试语句的库时就不太好了。我定义宏如下:

    #define LOG_INFO(info) __android_log_write(ANDROID_LOG_INFO,"JNI",info)
    #define LOG_ERROR(error) __android_log_write(ANDROID_LOG_ERROR,"JNI",error)

    然后在源代码中我可以调用 LOG_INFO("Library is called!");

  2. 捕获程序的标准输出/标准错误并将其导入 LogCat。来自Android Debug Bridge页:

    Viewing stdout and stderr

    By default, the Android system sends stdout and stderr (System.out and System.err) output to /dev/null. In processes that run the Dalvik VM, you can have the system write a copy of the output to the log file. In this case, the system writes the messages to the log using the log tags stdout and stderr, both with priority I.

    To route the output in this way, you stop a running emulator/device instance and then use the shell command setprop to enable the redirection of output. Here's how you do it:

      $ adb shell stop
    $ adb shell setprop log.redirect-stdio true
    $ adb shell start

    The system retains this setting until you terminate the emulator/device instance. To use the setting as a default on the emulator/device instance, you can add an entry to /data/local.prop on the device.

关于java - 如何在 JNI 中从 C++ 调用 Java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3902066/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com