android NDK下log的使用和封装2

44 篇文章 2 订阅
16 篇文章 0 订阅

参考:

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


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值