android NDK下log的使用和封装2

2024-06-21 15:38
文章标签 android 使用 封装 log ndk

本文主要是介绍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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1081625

相关文章

C语言中联合体union的使用

本文编辑整理自: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=179471 一、前言 “联合体”(union)与“结构体”(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

Vim使用基础篇

本文内容大部分来自 vimtutor,自带的教程的总结。在终端输入vimtutor 即可进入教程。 先总结一下,然后再分别介绍正常模式,插入模式,和可视模式三种模式下的命令。 目录 看完以后的汇总 1.正常模式(Normal模式) 1.移动光标 2.删除 3.【:】输入符 4.撤销 5.替换 6.重复命令【. ; ,】 7.复制粘贴 8.缩进 2.插入模式 INSERT

公共筛选组件(二次封装antd)支持代码提示

如果项目是基于antd组件库为基础搭建,可使用此公共筛选组件 使用到的库 npm i antdnpm i lodash-esnpm i @types/lodash-es -D /components/CommonSearch index.tsx import React from 'react';import { Button, Card, Form } from 'antd'

Lipowerline5.0 雷达电力应用软件下载使用

1.配网数据处理分析 针对配网线路点云数据,优化了分类算法,支持杆塔、导线、交跨线、建筑物、地面点和其他线路的自动分类;一键生成危险点报告和交跨报告;还能生成点云数据采集航线和自主巡检航线。 获取软件安装包联系邮箱:2895356150@qq.com,资源源于网络,本介绍用于学习使用,如有侵权请您联系删除! 2.新增快速版,简洁易上手 支持快速版和专业版切换使用,快速版界面简洁,保留主

如何免费的去使用connectedpapers?

免费使用connectedpapers 1. 打开谷歌浏览器2. 按住ctrl+shift+N,进入无痕模式3. 不需要登录(也就是访客模式)4. 两次用完,关闭无痕模式(继续重复步骤 2 - 4) 1. 打开谷歌浏览器 2. 按住ctrl+shift+N,进入无痕模式 输入网址:https://www.connectedpapers.com/ 3. 不需要登录(也就是

React+TS前台项目实战(十七)-- 全局常用组件Dropdown封装

文章目录 前言Dropdown组件1. 功能分析2. 代码+详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局Dropdown组件封装,可根据UI设计师要求自定义修改。 Dropdown组件 1. 功能分析 (1)通过position属性,可以控制下拉选项的位置 (2)通过传入width属性, 可以自定义下拉选项的宽度 (3)通过传入classN

Eclipse+ADT与Android Studio开发的区别

下文的EA指Eclipse+ADT,AS就是指Android Studio。 就编写界面布局来说AS可以边开发边预览(所见即所得,以及多个屏幕预览),这个优势比较大。AS运行时占的内存比EA的要小。AS创建项目时要创建gradle项目框架,so,创建项目时AS比较慢。android studio基于gradle构建项目,你无法同时集中管理和维护多个项目的源码,而eclipse ADT可以同时打开

android 免费短信验证功能

没有太复杂的使用的话,功能实现比较简单粗暴。 在www.mob.com网站中可以申请使用免费短信验证功能。 步骤: 1.注册登录。 2.选择“短信验证码SDK” 3.下载对应的sdk包,我这是选studio的。 4.从头像那进入后台并创建短信验证应用,获取到key跟secret 5.根据技术文档操作(initSDK方法写在setContentView上面) 6.关键:在有用到的Mo

android一键分享功能部分实现

为什么叫做部分实现呢,其实是我只实现一部分的分享。如新浪微博,那还有没去实现的是微信分享。还有一部分奇怪的问题:我QQ分享跟QQ空间的分享功能,我都没配置key那些都是原本集成就有的key也可以实现分享,谁清楚的麻烦详解下。 实现分享功能我们可以去www.mob.com这个网站集成。免费的,而且还有短信验证功能。等这分享研究完后就研究下短信验证功能。 开始实现步骤(新浪分享,以下是本人自己实现