所以我正在编写一个使用大型 C++ 库的 Android 应用程序。我已经一切正常,以便 java 应用程序可以调用 c++ 委托方法,但我发现自己希望可以将消息从 c++ 记录到 Android 日志中。这对于java来说很容易,但是我不知道如何从c++调用java方法。我的搜索找到了从 c++ 打开 jvm 的方法,这根本不是我想要做的。理想情况下,我想将 log 方法指针传递给 c++,然后可以在我需要的时候使用它。当然,java不支持方法指针。我的 java 方法看起来像这样:
private void log(String s){
Log.i(Tag, s); // Android log
}
我只是不知道如何让c++访问这个方法。
C++ 调用cout
and printf
不会出现在 LogCat 输出中。有两种解决方案。
-
使用 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!");
-
捕获程序的标准输出/标准错误并将其汇集到 LogCat 中。来自Android 调试桥 http://developer.android.com/guide/developing/tools/adb.html page:
查看标准输出和标准错误
默认情况下,Android 系统将 stdout 和 stderr(System.out 和 System.err)输出发送到 /dev/null。在运行 Dalvik VM 的进程中,您可以让系统将输出的副本写入日志文件。在这种情况下,系统使用日志标签 stdout 和 stderr 将消息写入日志,两者的优先级均为 I。
要以这种方式路由输出,请停止正在运行的模拟器/设备实例,然后使用 shell 命令 setprop 启用输出重定向。操作方法如下:
$ adb shell stop
$ adb shell setprop log.redirect-stdio true
$ adb shell start
系统会保留此设置,直到您终止模拟器/设备实例。要将该设置用作模拟器/设备实例上的默认设置,您可以将条目添加到设备上的 /data/local.prop 中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)