NDK开发之日志

Android的日志框架是名字为logger的内核模块。随时随地地对平台上的任何信息进行日志会产生大量信息,从而使得查看和分析这些日志变得非常困难。为了简化这个过程。Android 日志框架把日志消息分成4个日志缓冲区:
  • Main:主要应用程序的日志信息
  • Even:系统事件
  • Radio:Radio 相关的日志信息
  • System:调试时产生的低级系统调试信息
1.1原生日志 api
Android运行库系统提供了一组 API调用以便于java 代码和原生代码向logger内核模块发送日志信息。通过android/log.h 头文件来展示原生代码的日志API。为了使用日志函数,原生代码需要先包含头文件。
 
#include <android/log.h>
 
#define LOG_TAG "logtest"  
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define LOGT(...) __android_log_print(ANDROID_LOG_INFO,"alert",__VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
 
 
调用很简单
 
JNIEXPORT void JNICALL Java_com_example_elvin_unit5_jni_TestJni_startToShowLog
        (JNIEnv *env, jobject job){
    LOGI("test the logcat ");
}
从上面可以简单看的看到,实际的日志内容是由__android_log_print执行,日志输出接口实际上有三个
 
1.1.1生成简单的日志消息
__android_log_write 可以生成简单的字符串作为日志消息。
__android_log_write(ANDROID_LOG_VERBOSE,"testlog","simple log out");
 
1.1.2 生成格式化日志消息
__android_log_print:可用于生成一个格式化字符串作为日志消息。
 
__android_log_print(ANDROID_LOG_INFO,"alert","test %s","log");
 
1.1.3 生成参数不确定的日志输出
__android_log_vprint:除了参数传递方式,其他功能和__android_log_print完全相同。如果想要调用日志函数创递给当前函数的参数个数动态变化是,该函数的优势就会体现出来。
 
void my_log_verbose(const char * format,...){
    va_list args;
    va_start(args,format);
    __android_log_vprint(ANDROID_LOG_VERBOSE,"testlog",format,args);
    va_end(args);
}
 
调用
 
my_log_verbose("log level is %d",110);
1.1.4 断言失败日志
与其他日志函数比较,它不包括日志优先级,但总是将所有的日志记录为fatal,一经触发就会跑出异常,中断程序。
void __android_log_assert(const char* cond, const char* tag, const char* fmt,...);
 
上面这些是一些简单的用法,比较全面的log的控制可以参考Android c++高级编程第五章,已经有人把书里面全部log代码放在博客上,如下面这位
 
在编译之前,还需要修改android.mk 文件从而将原生模块与日志库进行连接,可以通过使用构建系统变量LOCAL_LDLIBS 完成这个操作。
 
LOCAL_LDLIBS := -llog
 
posted @ 2017-08-30 12:20  抹茶蛋挞  阅读(389)  评论(0编辑  收藏  举报