Android NDK编译的C语言ELF二进制文件如何通过API输出日志到Logcat?
Android NDK编译的C语言ELF文件输出日志到Logcat的方法
当然有对应的API可以实现,Android NDK原生提供了专门用于输出日志到Logcat的函数集,核心是__android_log_print系列函数,具体用法如下:
所需头文件与库依赖
首先需要引入头文件<android/log.h>,并且在编译时链接NDK的log库,否则会出现未定义符号错误。常用日志函数示例
通常会定义宏来简化日志调用,按日志级别封装更方便:#include <android/log.h> // 自定义日志标签,方便在Logcat中过滤 #define LOG_TAG "NativeModule" // Debug级别日志宏 #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) // Error级别日志宏 #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) // Info级别日志宏 #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) void native_function() { // 输出带参数的Debug日志 LOGD("用户ID:%d,用户名:%s", 1001, "test_user"); // 输出Error日志 LOGE("文件读取失败,路径:%s", "/data/local/tmp/test.txt"); // 输出Info日志 LOGI("原生模块初始化完成"); }编译时链接log库
- 若使用Android.mk构建,需添加:
LOCAL_LDLIBS += -llog - 若使用CMakeLists.txt构建,需在目标链接时添加log库:
target_link_libraries(your-native-library-name log)
- 若使用Android.mk构建,需添加:
其他日志函数
除了__android_log_print,还有更基础的__android_log_write函数,直接指定日志级别、标签和内容:#include <android/log.h> void simple_log() { __android_log_write(ANDROID_LOG_WARN, "NativeModule", "这是一条警告日志"); }
注意:如果是已经编译完成的ELF二进制文件,若编译时未链接log库且未调用上述日志函数,无法直接通过修改ELF文件添加日志能力,需要重新编译代码时引入上述逻辑并链接log库。
内容的提问来源于stack exchange,提问作者August Vrubel
相关产品推荐
相关产品推荐

