Android Java、NDK/JNI、C++打印log

目录

  • 一、Java上层打印log
  • 二、Android Studio NDK/JNI中打印log
    • 2.1 示例
    • 2.2 log类型
  • 三、Native层打印LOG
    • 3.1 Liblog 库
    • 3.2 Liblog的用法
    • 3.3 输出ALOGV等级的log
    • 3.4 FUNCTION与func的区别


一、Java上层打印log

Android的Java程序直接调用android.util.Log类来输出Log即可。

 Log.d(TAG, "no listener for back data!");

android.util.Log常用的方法有以下5个:Log.v() Log.d() Log.i() Log.w() 以及 Log.e() 。
根据首字母对应VERBOSE,DEBUG,INFO, WARN,ERROR。

1、Log.v 的调试颜色为黑色的,任何消息都会输出,这里的v代表verbose啰嗦的意思;
2、Log.d的输出颜色是蓝色的,仅输出debug调试的意思,但他会输出上层的信息,过滤起来可以通过DDMS的Logcat标签来选择
3、Log.i的输出为绿色,一般提示性的消息information,它不会输出Log.v和Log.d的信息,但会显示i、w和e的信息
4、Log.w的意思为橙色,可以看作为warning警告,一般需要我们注意优化Android代码,同时选择它后还会输出Log.e的信息
5、Log.e为红色,可以想到error错误,这里仅显示红色的错误信息,这些错误就需要我们认真的分析,查看栈的信息了

二、Android Studio NDK/JNI中打印log

使用<android/log.h>头文件下的 __android_log_print

2.1 示例

// 导入必须的android/log.h头文件
#include <android/log.h>// 可选。定义方便使用的宏
#definde LOGE(...) __android_log_print(ANDROID_LOG_ERROR, "Tag", __VA_ARGS__)int main(int argc, char *argv[])
{// 直接使用LOGE宏打印LOGE("I'm Log!");
}

2.2 log类型

在android/log.h定义有:

typedef enum android_LogPriority {ANDROID_LOG_UNKNOWN = 0,ANDROID_LOG_DEFAULT, /* only for SetMinPriority() */ANDROID_LOG_VERBOSE, //logvANDROID_LOG_DEBUG,   //logdANDROID_LOG_INFO,    //logiANDROID_LOG_WARN,    //logwANDROID_LOG_ERROR,   //logeANDROID_LOG_FATAL,ANDROID_LOG_SILENT, /* only for SetMinPriority(); must be last */
} android_LogPriority;

三、Native层打印LOG

要在c/c++中记录Log通常的做法是:

定义自己的TAG_LOG宏;
包含头文件log.h;
然后在需要记录Log的地方直接用ALOGV/ALOGD/ALOGI/ALOGW/ALOGE即可。

比如,文件logtest.c中头文件部分这样写,

#define LOG_TAG "lights"
#include <cutils/log.h>

3.1 Liblog 库

Android 给 Native 层的程序提供一个 liblog 库,用来输出日志。如果程序中需要打印 Log,可以包含cutils/log.h 这个头文件,并且定义自己的 LOG_TAG,就可以使用这个 liblog。liblog 提供了如下 Log 打印函数:

ALOGX
ALOGX_IF
IF_ALOGX

ALOGX中 X 代表 Log 优先级,liblog 总共有5级,分别对应 V, D, I, W, E,具体意义如下:

  • V: Verbose, 调试时用的冗余信息,在 Release 版本中会被去掉,可以在程序中定义 LOG_NDEBUG 为0,来打开这个级别的 LOG
  • D: Debug, 调试 Log,在 Release 版本中会被保留,但可以动态关闭这个级别的 Log
  • I: Info,程序运行时的状态 Log,一般都会保留这个级别的 Log
  • W: Warning, 程序警告 Log,对调试非常有帮助,需要保留
  • E: Error, 程序错误 Log,这个级别 Log 优先级最高,出现这个 Log 意味着程序出错了

例如:

ALOGE("%s must be defined as a build property", property);

使用ALOGx_IF() 系列函数来打印日志。ALOGx_IF() 函数根据输入的条件来决定是否打印日志,

ALOGV_IF(cond, …):cond 为 true 时输出 VERBOSE 级别的日志。
ALOGD_IF(cond, …):cond 为 true 时输出 DEBUG 级别的日志。
ALOGI_IF(cond, …):cond 为 true 时输出 INFO 级别的日志。
ALOGW_IF(cond, …):cond 为 true 时输出 WARNING 级别的日志。
ALOGE_IF(cond, …):cond 为 true 时输出 ERROR 级别的日志。

IF_ALOGx() 用于判断需求的级别是否大于当前日志级别,从而可以控制日志输出。IF_ALOGx() 系列函数包括,

IF_ALOGV():当日志级别小于等于 VERBOSE 时,返回 true。
IF_ALOGD():当日志级别小于等于 DEBUG 时,返回 true。
IF_ALOGI():当日志级别小于等于 INFO 时,返回 true。
IF_ALOGW():当日志级别小于等于 WARNING 时,返回 true。
IF_ALOGE():当日志级别小于等于 ERROR 时,返回 true。

3.2 Liblog的用法

通过一个测试程序说明 liblog 的用法:

#include <stdio.h>
#include <cutils/log.h>
#include <stdlib.h>
#include <unistd.h>
#define LOG_TAG "logtest"static bool con = true;
int main(int argc, char *argv[])
{printf("this is a test log using printf");ALOGI("This is a test log using ALOGI");ALOGD("This is a test log using ALOGD");ALOGD_IF(con, "this is a test using log ALOGD_IF");return 0;
}

3.3 输出ALOGV等级的log

V等级的log如果要正常输出需要增加宏定义:

#define LOG_NDEBUG 0

设置后才可以输出ALOGV等级的log

3.4 FUNCTION与func的区别

ALOGD参数中FUNCTION与func的区别

ALOGD("%s: Value (NATIVE) = %d", __FUNCTION__, value);
ALOGD("%s: Value (NATIVE) = %d", __func__, value);__FUNCTION__: 只输出方法名
__func__:输出方法返回值、类名、方法名

参考链接:
Android调试源码正确姿势打开ALOGV
在 Android Native 程序中输出 LOG
android系统中log机制
在 C/C++ 语言中特定的宏,如 FUNCTION

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/33773.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 8版本的新功能和改进有哪些?(MySQL收藏版)

目录 1. 简单介绍 2. 发展历史 3. MySQL 8产品特性 4. 数据库性能重点分析 1. 原生 JSON 支持改进 2. 隐式列优化 3. 改进的查询优化器 4. 并行查询 5. 分区表改进 MySQL 是一个流行的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由瑞典公司 M…

了解SD-WAN与传统WAN的区别

近年来&#xff0c;许多企业选择了SD-WAN作为他们的网络解决方案。云基础架构的SD-WAN不仅具备成本效益&#xff0c;而且提供更安全、更可靠的WAN连接&#xff0c;有助于实现持续盈利。客户能够更好地控制他们的网络&#xff0c;个性化定制且无需额外成本。 那么&#xff0c;为…

服务器数据恢复—raid故障导致部分分区无法识别/不可用的数据恢复案例

服务器数据恢复环境&#xff1a; 一台某品牌DL380服务器中3块SAS硬盘组建了一组raid。 服务器故障&#xff1a; RAID中多块磁盘出现故障离线导致RAID瘫痪&#xff0c;其中一块硬盘状态指示灯显示红色。服务器上运行的数据库在D分区&#xff0c;备份文件存放在E分区。由于RAID瘫…

LabVIEW火箭发动机试车台程序

火箭发动机试车台是火箭发动机研制过程中的关键环节之一&#xff0c;通过模拟实际工作环境对发动机进行测试&#xff0c;确保其性能和可靠性。随着科研需求的不断变化和技术的进步&#xff0c;对试车台的灵活性、可靠性和易维护性提出了更高的要求。基于LabVIEW开发的试车台程序…

[信号与系统]模拟域中的一阶低通滤波器和二阶滤波器

前言 不是学电子出身的&#xff0c;这里很多东西是问了朋友… 模拟域中的一阶低通滤波器传递函数 模拟域中的一阶低通滤波器的传递函数可以表示为&#xff1a; H ( s ) 1 s ω c H(s) \frac{1}{s \omega_c} H(s)sωc​1​ 这是因为一阶低通滤波器的设计目标是允许低频信…

什么是深拷贝,什么是浅拷贝

在计算机科学中&#xff0c;特别是涉及到编程语言如JavaScript、Java、C等时&#xff0c;我们经常遇到“深拷贝”和“浅拷贝”这两个概念。它们都与对象的复制有关&#xff0c;但处理方式不同。 浅拷贝 (Shallow Copy): 浅拷贝只复制对象的顶层属性&#xff08;或称为“引用”…

go switch 与 interface

go switch 与 interface 前言 前言 github.com/google/cel-go/common/types/ref type Val interface {// ConvertToNative converts the Value to a native Go struct according to the// reflected type description, or error if the conversion is not feasible.ConvertTo…

05-java基础——循环习题

循环的选择&#xff1a;知道循环的次数或者知道循环的范围就使用for循环&#xff0c;其次再使用while循环 猜数字 程序自动生成一个1-100之间的随机数&#xff0c;在代码中使用键盘录入去猜出这个数字是多少&#xff1f; 要求&#xff1a;使用循环猜&#xff0c;一直猜中为止…

时序预测 | Matlab基于CNN-BiLSTM-Attention多变量时间序列多步预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于CNN-BiLSTM-Attention多变量时间序列多步预测&#xff1b; 2.多变量时间序列数据集&#xff08;负荷数据集&#xff09;&#xff0c;采用前96个时刻预测的特征和负荷数据预测未来96个时刻的负荷数据&…

品牌为什么需要3D营销?

在对比传统品牌营销手段时&#xff0c;线上3D互动营销以其更为生动的展示效果脱颖而出。它通过构建虚拟仿真场景&#xff0c;创造出一个身临其境的三维空间&#xff0c;充分满足了客户对实体质感空间的期待。不仅如此&#xff0c;线上3D互动营销还能实现全天候24小时无间断服务…

PyTorch中“No module named ‘torch._six‘“的报错场景及处理方法

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 在使用PyTorch时&#xff0c;您可能会遇到"No module named ‘torch._six’"的错误。这通常是因为PyTorch的某些…

中介子方程三十二

XXFXXuXXWXXuXXdXXrXXαXXuXpXXKXXpXuXXαXXrXXdXXuXWXπXXWXeXyXeXbXπXpXXNXXqXeXXrXXαXXuXpXXKXXpXuXXαXXrXXeXqXXNXXpXπXbXeXyXeXWXXπXWXuXXdXXrXXαXXuXpXXKXXpXuXXαXXrXXdXXuXXWXXuXXFXXEXXyXXEXXrXXαXXuXpXXKXXpXuXXαXXrXXEXXyXXαXiXXαXiXrXkXtXyXXpXVXXdXuXWX…

梅花易数排盘 api数据接口

梅花易数为北宋易学家邵雍所传&#xff0c;因观梅知易数而得名。以卦象生克为主&#xff0c;而不分析爻象。是为梅花易数预测。 接口名称&#xff1a;流盘-梅花易数 接口平台&#xff1a;缘份居国学研究(缘份居国学研究开发者API) 接口地址&#xff1a;https://api.yuanfenj…

来自工业界的知识库 RAG 服务(五),模块化知识库 GoMate 实现方案详解

背景介绍 很早以前就看过一篇介绍 RAG 的综述性文章 Retrieval-Augmented Generation for Large Language Models: A Survey, 其中介绍了 RAG 的模块化架构&#xff1a; 但是一直没有看到对应的实现方案&#xff0c;以前也没有理解此框架的优势之处。随着在相关领域的持续实…

门店通微信小程序系统源码

&#x1f4f1;&#xff1a;便捷购物新选择 &#x1f3e2;一、什么是门店通微信小程序&#xff1f; 随着移动互联网的快速发展&#xff0c;微信小程序成为了我们日常生活中不可或缺的一部分。门店通微信小程序是一款集合了多家门店信息、服务、优惠等功能于一体的工具&#xf…

centos 安装deb格式安装包

背景 研发给了我一个deb包&#xff0c;需要我在centos 这种服务器操作系统上安装... deb包安装一般是使用dpkg -i xxxx.deb 命令&#xff0c;dpkg是Debian类型的系统,但是 通常centos是没有dpkg命令的... 直接就报&#xff1a;bash dpkg 未找到命令... 本来找研发给我编译rp…

SpringCloud Alibaba Sentinel规则持久化实践总结

默认情况下&#xff0c;一旦我们重启应用&#xff0c;sentinel规则将消失&#xff0c;生产环境需要将配置规则进行持久化。这里我们实践将Sentinel持久化到Nacos中。 ① pom依赖 我们引入sentinel-datasource-nacos&#xff1a; <dependency><groupId>com.aliba…

游戏AI的创造思路-技术基础-深度学习(5)

继续深度学习技术的探讨&#xff0c;填坑不断&#xff0c;头秃不断~~~~~ 3.5. 自编码器&#xff08;AE&#xff09; 3.5.1. 定义 自编码器&#xff08;Autoencoder, AE&#xff09;是一种数据的压缩算法&#xff0c;其中压缩和解压缩函数是数据相关的、有损的、从样本中自动学…

[ios逆向]查看ios安装包ipa签名证书embedded.mobileprovision解密 附带解密环境openssl

openssl smime -inform der -verify -noverify -in embedded.mobileprovision 解密embedded.mobileprovision文件 链接&#xff1a;https://pan.baidu.com/s/1UwNOWONKV1SNj5aX_ZZCzQ?pwdglco 提取码&#xff1a;glco –来自百度网盘超级会员V8的分享 可以使用everything 查看…

matlab绘制二维曲线,如何设置线型、颜色、标记点类型、如何设置坐标轴、matlab 图表标注、在图中标记想要的点

matlab绘制二维曲线&#xff0c;如何设置线型、颜色、标记点类型、如何设置坐标轴、matlab 图表如何标注、如何在图中标记想要的点 matlab绘制二维曲线&#xff0c;如何在图中标记想要的点。。。如何设置线型、颜色、标记点类型。。。如何设置坐标轴。。。matlab 图表标注操作…