参考:
android NDK下log的使用和封装:http://blog.csdn.net/u012005313/article/details/52059053
C stdarg.h的使用:http://blog.csdn.net/u012005313/article/details/52122077
#################################################################
上一次总结了log的使用和封装后,觉得应该已经结束了。没想到,在接下来的使用过程中,发现还是有很多的问题出现,所以,这一次,结合新的问题和发现,对logutil.hpp再次进行封装。
##################################################################3
功能更新:
1.再上一次的使用中,我把TAG命名为同一个名字,这样就导致了一个问题:但你的日志信息过多时,不利于你查找想要的内容。所以这一次对每条信息均设置新的TAG。
2.学习了printf的使用,对C/C++环境下的信息,实现末尾自动换行的功能!!!
3.结合Android中logCat的用法,对C/C++环境下的信息,可实现按等级输出!!!
###############################################################33333
先上代码:
logutil.hpp
#ifndef LOGUTIL_HPP
#define LOGUTIL_HPP
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#define ANDROID_NDK false
#if ANDROID_NDK
#include <jni.h>
#include <android/log.h>
#endif
// ----------------------------------------------------------
const int VERBOSE = 1;
const int DEBUG = 2;
const int INFO = 3;
const int WARN = 4;
const int ERROR = 5;
const int NOTHING = 6;
const int LEVEL = VERBOSE;
// ----------------------------------------------------------
void log_print_verbose(const char *TAG, const char *fmt, ...);
void log_print_debug(const char *TAG, const char *fmt, ...);
void log_print_info(const char *TAG, const char *fmt, ...);
void log_print_warn(const char *TAG, const char *fmt, ...);
void log_print_error(const char *TAG, const char *fmt, ...);
#if ANDROID_NDK
#define LOGV(TAG, ...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)
#define LOGD(TAG, ...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
#define LOGI(TAG, ...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)
#define LOGW(TAG, ...) __android_log_print(ANDROID_LOG_WARN, TAG, __VA_ARGS__)
#define LOGE(TAG, ...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)
#else
#define LOGV(TAG, fmt, ...) log_print_verbose(TAG, fmt, ##__VA_ARGS__)
#define LOGD(TAG, fmt, ...) log_print_debug(TAG, fmt, ##__VA_ARGS__)
#define LOGI(TAG, fmt, ...) log_print_info(TAG, fmt, ##__VA_ARGS__)
#define LOGW(TAG, fmt, ...) log_print_warn(TAG, fmt, ##__VA_ARGS__)
#define LOGE(TAG, fmt, ...) log_print_error(TAG, fmt, ##__VA_ARGS__)
#endif
#endif // LOGUTIL_HPP
logutil.cpp
#include "logutil.hpp"
void log_print_verbose(const char *TAG, const char *fmt, ...) {
if (LEVEL <= VERBOSE) {
char printf_buf[1024];
va_list args;
va_start(args, fmt);
vsprintf(printf_buf, fmt, args);
va_end(args);
// 判断是否有换行符
bool flag = false;
if (fmt[strlen(fmt)-1] == '\n')
flag = true;
if (flag) {
printf("V/%s: %s", TAG, printf_buf);
} else {
printf("V/%s: %s\n", TAG, printf_buf);
}
}
}
void log_print_debug(const char *TAG, const char *fmt, ...) {
if (LEVEL <= DEBUG) {
char printf_buf[1024];
va_list args;
va_start(args, fmt);
vsprintf(printf_buf, fmt, args);
va_end(args);
// 判断是否有换行符
bool flag = false;
if (fmt[strlen(fmt)-1] == '\n')
flag = true;
if (flag) {
printf("D/%s: %s", TAG, printf_buf);
} else {
printf("D/%s: %s\n", TAG, printf_buf);
}
}
}
void log_print_info(const char *TAG, const char *fmt, ...) {
if (LEVEL <= INFO) {
char printf_buf[1024];
va_list args;
va_start(args, fmt);
vsprintf(printf_buf, fmt, args);
va_end(args);
// 判断是否有换行符
bool flag = false;
if (fmt[strlen(fmt)-1] == '\n')
flag = true;
if (flag) {
printf("I/%s: %s", TAG, printf_buf);
} else {
printf("I/%s: %s\n", TAG, printf_buf);
}
}
}
void log_print_warn(const char *TAG, const char *fmt, ...) {
if (LEVEL <= WARN) {
char printf_buf[1024];
va_list args;
va_start(args, fmt);
vsprintf(printf_buf, fmt, args);
va_end(args);
// 判断是否有换行符
bool flag = false;
if (fmt[strlen(fmt)-1] == '\n')
flag = true;
if (flag) {
printf("W/%s: %s", TAG, printf_buf);
} else {
printf("W/%s: %s\n", TAG, printf_buf);
}
}
}
void log_print_error(const char *TAG, const char *fmt, ...) {
if (LEVEL <= ERROR) {
char printf_buf[1024];
va_list args;
va_start(args, fmt);
vsprintf(printf_buf, fmt, args);
va_end(args);
// 判断是否有换行符
bool flag = false;
if (fmt[strlen(fmt)-1] == '\n')
flag = true;
if (flag) {
printf("E/%s: %s", TAG, printf_buf);
} else {
printf("E/%s: %s\n", TAG, printf_buf);
}
}
}
使用起来也很简单
1.如果你实在NDK环境下,那么设置标识符ANDROID_NDK为true即可;如果你在C/C++环境下,那么设置ANDROID_NDK为false。
2.通过设置LEVEL值,可以屏蔽掉下一级的信息。比如,当你的LEVEL值设为INFO,那么VERBOSE和DEBUG级别的信息(即函数LOGV和LOGD)将不会输出;当你完成整个工程后,设置LEVEL为NOTHING,那么所有的调试信息都不会输出。