本文转载自:https://blog.csdn.net/AndroidMage/article/details/52225068

说明: 这里我根据个人工作情况说明在各个层打印log。如有问题欢迎拍砖。

1. Java层打印log。
这个比较简单Android有封装好的Log.java, 可以使用。
例如:

Log.d(String Tag, String msg);

个人习惯: 单独写一个类包装一下:MLog.java:

import android.util.Log;

public class MLog {
public final static boolean DEBUG = true;

public static void d(String tag, String msg) {
if (DEBUG) {
Log.d(tag, msg);
}
}
...
}
1
2
3
4
5
6
7
8
9
10
11
12
2. Native 层打印log。
网络上很多资料:http://stackoverflow.com/questions/12159316/logging-values-of-variables-in-android-native-ndk

步骤如下:

Android.mk 中添加:

LOCAL_LDLIBS :=-llog

在需要打印的log的地方使用:
#include <android/log.h>
#define TAG "DroidMage" // 这个是自定义的LOG的标识
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__) // 定义LOGD类型

xxx_function() {

LOGD("%s hello world", "MSG");
}
1
2
3
4
5
6
7
8
9
NOTE: 这只是对__android_log_print() 函数做了包装而已 原型如下:

/**
* int __android_log_print(int prio, const char *tag, const char *fmt, ...)
*
* ANDROID_LOG_DEBUG : 是在头文件定义的log level,类似与java层Log.d()打印Debug信息。
* tag : char * 类型的字符串。
* format : char* 格式化的字符串
*/
// 例子:
char * tag = "DroidMage";
char * format = "%s";
char * msg = "This is for test!";
__android_log_print(ANDROID_LOG_DEBUG, tag, format, msg);
1
2
3
4
5
6
7
8
9
10
11
12
13
Android 中有 < cutils/log.h> 做好了封装:

#define LOG_TAG DroidMage //一定要定义,原因是< log/log.h> 做了封装,没有定义则未NULL。

xxx_func() {
//log 的Tag就是所定义LOG_TAG
LOGD("%s", msg);
}
1
2
3
4
5
6
7
3. bionic层打印log(笔者做过系统开发的工作,有时需要调试lib层)
参考源码:”/bionic/libc/bionic/private/libc_logging.cpp”

#include "private/libc_logging.h"

xxx_function() {

//ANDROID_LOG_DEBUG: int 类型, 定义log level, 参考"/bionic/libc/bionic/private/libc_logging.h" 定义。
__libc_format_log(ANDROID_LOG_DEBUG, tag, "%s", msg);
}
1
2
3
4
5
6
7
8
9
未完待续。。。
---------------------
作者:机器魔法师
来源:CSDN
原文:https://blog.csdn.net/AndroidMage/article/details/52225068
版权声明:本文为博主原创文章,转载请附上博文链接!

Android Java层,Native层,Lib层打印Log简介【转】的更多相关文章

  1. 封装一个简单好用的打印Log的工具类And快速开发系列 10个常用工具类

    快速开发系列 10个常用工具类 http://blog.csdn.net/lmj623565791/article/details/38965311 ------------------------- ...

  2. Android Framework中的Application Framework层介绍

    Android的四层架构相比大家都很清楚,老生常谈的说一下分别为:Linux2.6内核层,核心库层,应用框架层,应用层.我今天重点介绍一下应用框架层Framework,其实也是我自己的学习心得. Fr ...

  3. Android 从上层到底层-----app层

    CPU:RK3288 系统:Android 5.1 功能:上层 app 控制 led 亮灭 开发板:Firefly RK3288 MainActivity.java package com.aaron ...

  4. Android源码剖析之Framework层升级版(窗口、系统启动)

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 看本篇文章之前,建议先查看: Android源码剖析之Framework层基础版 前面讲了frame ...

  5. Android 从上层到底层-----jni层

    CPU:RK3288 系统:Android 5.1 功能:上层 app 控制 led 亮灭 开发板:Firefly RK3288 led_jni.h path:hardware/rockchip/fi ...

  6. Android 从上层到底层-----hal层

    CPU:RK3288 系统:Android 5.1 功能:上层 app 控制 led 亮灭 开发板:Firefly RK3288 led_hal.c path:hardware/rockchip/fi ...

  7. Android 从上层到底层-----kernel层

    CPU:RK3288 系统:Android 5.1 功能:上层 app 控制 led 亮灭 开发板:Firefly RK3288 1.在dts文件中增加 led 设备 path:kernel/arch ...

  8. Android HAL层与Linux Kernel层驱动开发简介

    近日稍微对Android中的驱动开发做了一些简要的了解. HAL:Hardware Abstract Layer 硬件抽象层,由于Linux Kernel需要遵循GPL开源协议,硬件厂商为了保护自己硬 ...

  9. 【转载】 JAVA三层架构,持久层,业务层,表现层的理解

    JAVA三层架构,持久层,业务层,表现层的理解 转载:http://blog.csdn.net/ljf_study/article/details/64443653 SSH: Struts(表示层)+ ...

随机推荐

  1. JavaScript 深入了解对象中的属性

    本篇主要介绍JS中对象的属性,包括:属性的分类.访问方式.检测属性.遍历属性以及属性特性等内容. 目录 1. 介绍:描述属性的命名方式.查找路径以及分类 2. 属性的访问方式:介绍'.'访问方式.'[ ...

  2. Python记录2:数据类型

    一Python的数据类型可以分为可变与不可变两种: 可变类型:值改变,但是id不变,证明就是在改变原值,就是可变类型 如list   dict 列表和字典都是可变类型 不可变类型:值改变,id也跟着改 ...

  3. Python全栈-day5-数据类型

    一.元组 1.元组基础 1)定义:不可变的‘列表’,定义方式(元素1,元素2.......) 2)用途:存多个值,但是只能读不能写 注意:元组的不可变指的是元组内元素id的不可变 t = (11,2, ...

  4. spring 框架的优点

    谈spring 框架的优点就是说spring 框架2大核心技术的优点 1. 控制反转:控制反转是将对象的创建和管理交给spring容器,已经管理对象之间的依赖关系, 那么将对象的创建和生命周期的管理交 ...

  5. 添加Google搜索

    给自己的网站加一个搜索功能很简单,代码如下: 欢迎访问我的博客:http://67566894.iteye.com/ <form action="http://www.google.c ...

  6. Yii2将查询数据变为键值对数组及查询构建器

  7. Ontology Relations

    Overview The following page documents the relations used in the filtered GO ontology. For informatio ...

  8. qt5.5.1 移植4412的问题过程

    1.编译错误: ../WTF/wtf/unicode/wchar/UnicodeWchar.h: In function 'bool WTF::Unicode::isAlphanumeric(UCha ...

  9. Hive中变量的使用

    1.Hive配置属性 (1)命令行方式 Hive配置属性存储于 hiveconf 命名空间中,该命名空间中的属性是可读写的.在查询语句中插入 '${hiveconf:变量名}',就可以通过 hive ...

  10. LDA模型了解及相关知识

    什么是LDA? LDA是基于贝叶斯模型的,涉及到贝叶斯模型离不开“先验分布”,“数据(似然)”和"后验分布"三块.贝叶斯相关知识:先验分布 + 数据(似然)= 后验分布. 贝叶斯模 ...