如何通过JNI/NDK获得Android应用中使用的c++库的日志行(printf, cout等)的控制台输出
How to get console output of log lines (printf, cout ,etc...) of c++ library used in Android app via JNI/NDK
在我的Android应用中,我通过JNI使用了一个本地c++库。如果在调试模式下构建,该库将生成日志行。我想把日志行重定向到logcat。
所以我在调试模式下创建了这个库,使用NDK_DEBUG=1
和设置LOCAL_LDLIBS += -llog
我的设备没有根,但我设置:
$ adb shell stop
$ adb shell setprop log.redirect-stdio true
$ adb shell start
就像在http://developer.android.com/tools/debugging/debugging-log.html#viewingStd上描述的那样,这里是"std::cout"Android-ndk
使用__android_log_print(ANDROID_LOG_INFO, "foo", "Error: %s", foobar);
是工作的,但它不是我的选择,因为c++库也用于iOS应用程序,所以我不想改变本机代码。
我也试图用这个设置在JNI包装器中创建控制台输出(printf),但除了"__android_log_print"语句外,输出也不可见。
我错过了什么还是重定向只适用于根设备?
如何获得本机代码生成的控制台输出。
提前感谢
我使用一个日志头来打印跨平台日志。
在c++代码中只写LOGD("msg");或包厢("味精");并打印检查平台的信息。
尝试创建一个跨平台的日志头,如:
Logs.h
# ifdef ANDROID
// LOGS ANDROID
# include <android/log.h>
# define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG,__VA_ARGS__)
# define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , LOG_TAG,__VA_ARGS__)
# define LOGI(...) __android_log_print(ANDROID_LOG_INFO , LOG_TAG,__VA_ARGS__)
# define LOGW(...) __android_log_print(ANDROID_LOG_WARN , LOG_TAG,__VA_ARGS__)
# define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , LOG_TAG,__VA_ARGS__)
# define LOGSIMPLE(...)
# else
// LOGS NO ANDROID
# include <stdio.h>
# define LOGV(...) printf(" ");printf(__VA_ARGS__); printf("t - <%s> n", LOG_TAG);
# define LOGD(...) printf(" ");printf(__VA_ARGS__); printf("t - <%s> n", LOG_TAG);
# define LOGI(...) printf(" ");printf(__VA_ARGS__); printf("t - <%s> n", LOG_TAG);
# define LOGW(...) printf(" * Warning: "); printf(__VA_ARGS__); printf("t - <%s> n", LOG_TAG);
# define LOGE(...) printf(" *** Error: ");printf(__VA_ARGS__); printf("t - <%s> n", LOG_TAG);
# define LOGSIMPLE(...) printf(" ");printf(__VA_ARGS__);
# endif // ANDROID
如果您的设备没有根,adb shell stop
/start
命令将不起作用。这意味着受精卵不会重新启动,所以它不会选择新的log.redirect-stdio
属性。无论如何,这个属性是一种hack——它导致同一进程中的VM创建一个线程来读取stdout/stderr并将它们转发到日志文件。
你最好的选择是使用可变日志宏,在__android_log_print
和任何iOS想要的基于预处理器符号(例如__ANDROID__
)之间切换。然后它就会编译成正确的东西
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 内联程序集printf将整数解释为地址
- 为什么mpfr_printf与十六进制浮点(%a转换说明符)的printf不同
- 是否可以配置提升日志刷新?
- C++ Setter/Getter,cout 工作,printf 失败
- 跟踪日志中的T.11803()是什么意思?
- Printf 命令不打印时添加了查找常见除数的新代码
- SIGSEGV, 分段错误. 而 printf() 数组索引的值
- 为什么在包含iostream时可以使用printf()?
- 加快在C++中读取/处理日志文件的速度
- 如何将消息时间戳写入日志文件?
- 分析包含 NMEA 句子的日志文件C++
- 如何修复输出日志中的"EnableInput can only be specified on a Pawn for its Controller"错误
- 创建具有验证和语法突出显示的自定义 printf
- 如何实现具有多个平台__FILE__和__LINE__信息的 C/C++ 可变参数日志记录宏?
- 如何将C/C++printf()消息重定向到windows电话日志系统
- 为什么 printf 可以屏蔽竞争条件,而系统日志不能?
- 错误地将字符串传递给printf样式的日志函数时缺少错误
- 如何通过JNI/NDK获得Android应用中使用的c++库的日志行(printf, cout等)的控制台输出