android NDK下log的使用和封装2

时间:2021-08-21 20:07:37

参考:

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,那么所有的调试信息都不会输出。