本文转载自: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. Oracle / PLSQL函数 - DECODE

    1.DECODE( expression , search , result [, search , result]... [, default] ) 参数说明: expression : 表中的某一 ...

  2. Unity shader学习之屏幕后期处理效果之均值模糊

    均值模糊,也使用卷积来实现,之不过卷积中每个值均相等,且相加等于1. 代码如下, 子类: using UnityEngine; public class MeanBlurRenderer : Post ...

  3. SV processses

    SV中的structured procedure: 1)intial procedure,keyword只有initial:最开始被调用一次: 2)always procedure,keyword包括 ...

  4. CALL与retn

    一.CALL 例如: 004013D9      CALL 00401C4C     //ESP = 0060F9C8 004013DE 相当于 sub esp,0x4; //ESP = 0060F9 ...

  5. valueError: This solver needs samples of at least 2 classes in the data, but the data contains only one class: 0

    问题描述:执行下面的代码,报错valueError: This solver needs samples of at least 2 classes in the data, but the data ...

  6. Python基础知识摘要

    python字典 增,删,改,查 1.增:XXX[新的key] = value 2.删:DEL XXX[key] 3.改:XXX[已经存在的key] = NewValue 4.查:aList.exte ...

  7. Python - 5.Exception Handling

    From:http://interactivepython.org/courselib/static/pythonds/Introduction/ExceptionHandling.html Exce ...

  8. Spark学习之路 (十九)SparkSQL的自定义函数UDF

    在Spark中,也支持Hive中的自定义函数.自定义函数大致可以分为三种: UDF(User-Defined-Function),即最基本的自定义函数,类似to_char,to_date等 UDAF( ...

  9. yum 原理C/S原理结构图

    yum 原理C/S原理结构图

  10. 自动添加菜品,加入运行中遇到的异常,生成日志文件...<工作中场景...>

    """ 很弱智的小脚本,记录下.也许以后看到会笑,因为太幼稚或者证明曾经也努力过.so... """ """ ...