本文主要是介绍android NDK下log的使用和封装2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
参考:
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,那么所有的调试信息都不会输出。
这篇关于android NDK下log的使用和封装2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!