在Android的c/c++代码中使用LOG

在Android中,Java代码通过android.util.Log输出Log信息,同样的本地c/c++代码也提供了相对应而且是更多的接口。Android直接在头文件(system/core/include/cutils/log.h)里定义了一些日志输出的宏,这些宏比android.util.Log提供了更多的日志输出接口。因此,使用这些宏,就可以进行和java代码中一样的日志输出。宏LOGD(),LOGE(),LOGI(),LOGV(),LOGW(),LOGD()分别对应android.util.Log中的Log.d(),Log.e(),Log.i(),Log.v(),Log.w()。

注意:这里的都是把日志输出到Main缓冲区。

另外,关于此文最好对照着《Android LOG机制流程图》一起来看。

log.h中对日志输出还提供一些更细的宏,比如对于LOGD(),还提供了LOGD_IF(),IF_LOGD(),SLOGD(),SLOGD_IF()。其中LOGD_IF()表示条件输出,IF_LOGD()用于测试是否需要输出,SLOGD()表示把日志输出到System日志缓冲,SLOGD_IF()表示条件成立的情况下,把日志输出到System日志缓冲。

注意:IF_LOGD()现在总是返回1.

因为,LOG分了VERBOSE/DEBUG/INFO/WARN/ERROR/ASSERT等类别,简单起见,以DEBUG为例的实现来说明。

#ifndef LOGD

#define LOGD(...) LOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__)

#endif

#ifndef LOGD_IF

#define LOGD_IF(cond, ...) \

( (CONDITION(cond)) \

? LOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__) \

: (void)0 )

#endif

#ifndef IF_LOGD

#define IF_LOGD() IF_LOG(LOG_DEBUG, LOG_TAG)

#endif

#ifndef SLOGD

#define SLOGD(...) ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__))

#endif

#ifndef SLOGD_IF

#define SLOGD_IF(cond, ...) \

( (CONDITION(cond)) \

? ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)) \

: (void)0 )

#endif

宏LOGD(),LOGE(),LOGI(),LOGV(),LOGW(),LOGD()其实最好后会使用以下的宏。

#ifndef LOG

#define LOG(priority, tag, ...) \

LOG_PRI(ANDROID_##priority, tag, __VA_ARGS__)

#endif

#ifndef LOG_PRI

#define LOG_PRI(priority, tag, ...)                                     \

({                                                                  \

if (((priority == ANDROID_LOG_VERBOSE) && (LOG_NDEBUG == 0)) ||  \

((priority == ANDROID_LOG_DEBUG) && (LOG_NDDEBUG == 0))  ||  \

((priority == ANDROID_LOG_INFO) && (LOG_NIDEBUG == 0))   ||  \

(priority == ANDROID_LOG_WARN)                          ||  \

(priority == ANDROID_LOG_ERROR)                         ||  \

(priority == ANDROID_LOG_FATAL))                            \

(void)android_printLog(priority, tag, __VA_ARGS__);     \

})

#endif

#define android_printLog(prio, tag, fmt...) \

__android_log_print(prio, tag, fmt)

而这一系列宏,最后还是调用了system/core/liblog/logd_write.c中的__android_log_print()

int __android_log_print(int prio, const char *tag, const char *fmt, ...)

{

va_list ap;

char buf[LOG_BUF_SIZE];

va_start(ap, fmt);

vsnprintf(buf, LOG_BUF_SIZE, fmt, ap);

va_end(ap);

return __android_log_write(prio, tag, buf);

}

这里还是调到了函数__android_log_write()。__android_log_write()组织了参数,又调用了write_to_log这个函数指针。

关于write_to_log这个函数指针的调用详情请参考《Android中LOG机制详解

要在c/c++中使用Log,很简单。通常的做法是:

定义自己的TAG_LOG宏;包含头文件log.h;然后在需要记录Log的地方直接用LOGV/LOGD/LOGI/LOGW/LOGE等即可。

比如,文件lights.c中就在开头这样写,

#define LOG_TAG "lights"

#include <cutils/log.h>

然后在该文件的后续部分,直接用LOGV/LOGE等来输出日志就可以。

在Android的c/c++代码中使用LOG,布布扣,bubuko.com

时间: 2024-12-06 06:03:01

在Android的c/c++代码中使用LOG的相关文章

Android如何在java代码中设置margin

习惯了直接在xml里设置margin(距离上下左右都是10dip),如: <ImageView android:layout_margin="10dip" android:src="@drawable/image" /> 只是有些情况下,需要在java代码里来写. API中,android.view.ViewGroup.MarginLayoutParams有个方法setMargins(left, top, right, bottom).可是View本身没

转--Android如何在java代码中设置margin

http://www.2cto.com/kf/201207/140111.html 红黑联盟: 习惯了直接在xml里设置margin(距离上下左右都是10dip),如: <ImageView android:layout_margin="10dip" android:src="@drawable/image" /> 只是有些情况下,需要在java代码里来写. API中,android.view.ViewGroup.MarginLayoutParams有个

Android程序如何在代码中改变图片原有的颜色

最近一边找工作一边完善之前的项目.之前安卓初中级的项目是模仿酷狗音乐播放器的.下载一个apk文件,改后缀,解压,然后根据官方应用的布局,用得到的图片照着做出来.记得酷狗首页有好几种主要图标,解压后得到的白色加透明组合成的,但官方应用是换主题颜色会跟着改变,这回正好有空就网上找来方法跟着改. 因为只是把白色改成别的颜色,所以不难. package com.example.ex_tupian; import android.app.Activity; import android.graphics.

Android 如何在Java代码中手动设置控件的marginleft

1.定义LayoutParams LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);//定义一个LayoutParams 2.在LayoutParams中设置marginLeft layoutParams.setMargins(20,0,0,0);//4个参数

Android.util.Log 关于Android开发中打印log

日常Android开发真机调试过程经常会遇到系统日志过多过快,想看的内容一闪而过的问题.而自定义些log可以很好的解决这些问题.   代码中添加 log  androidsdk中提供了log输出的api,方法在android.util.Log类中. Log.v(tag,message);        //verbose模式,打印最详细的日志 Log.d(tag,message);        //debug的日志 Log.i(tag,message);        //info的日志 Lo

android动态调试samli代码

转载自看雪http://bbs.pediy.com/showthread.php?t=189610,非常感谢原作者分享! 初涉移动端,请各位前辈多多指教! 本文参考http://www.kaifazhe.com/android_school/380973.html在此,对作者表示感谢! 跟踪apk一般的做法是在反编译的smali代码中插入log输出,然后重新编译运行看输出日志,这种方法费时费力,如果能够动态调试就最好了.下面就给大家介绍apk+eclipse来调试smali. 前期准备:ecli

常用android的smali注入代码

常用android的smali注入代码 1.增加log信息 const-string v3,"SN" invoke-static {v3,v0}, Landroid/util/Log;->v(Ljava/lang/String;Ljava/lang/String;)I 2.弹出消息框 new AlertDialog.Builder(self) .setTitle("普通对话框") .setMessage("你好,Android!") .sh

【转】java代码中实现android背景选择的selector-StateListDrawable的应用

原文网址:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0924/1712.html 下面的代码应该很多人都熟悉: 1 2 3 4 5 6 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android">

如何从python代码中直接访问Android的Service

在Kivy中,通过pyjnius扩展可以间接调用Java代码,而pyjnius利用的是Java的反射机制.但是在Python对象和Java对象中转来转去总让人感觉到十分别扭.好在android提供了binder这个进程间通信的功能,Java中的Service也是基于Binder的C++代码封装来实现进程间通信的,这也为从Python代码中绕开pyjnius直接访问Java代码提供了可能,既然Java的Service是基于C++的封装来实现的,也同样可以在Python中封装同样的C++代码,这篇文