Android Native C Log

本文介绍了在Android Native C开发中使用两种不同的方法记录日志信息。第一种方法通过包含Log.h并定义LOG_TAG实现;第二种方法则是在mk文件中链接-llog库,并在cpp文件中使用__android_log_print函数来输出不同级别的日志。

Android Native C Log
//Rocky@20110524

我们在做Android java的时候,为了调试我们经常使用Log.i,Log.d等等log函数,这样非常方便我们调试使用。但是
如果是我们在使用Native C在做的时候,实际上也是可以利用LOG来输出调试信息的。查看方式一样。
有两种方式:

方式一:

    包含#include <utils/Log.h>
    我们查看这个文件system/core/include/cutils/log.h
    在开头发现

    #ifndef LOG_TAG
    #define LOG_TAG NULL
    #endif
       
    对于这个词我们的敏感度,我们知道,需要设置TAG信息。
    那么我们可肯定是需要在使用这个log.h前,定义一个LOG_TAG
   
    那么在Native C中我们常用的做法如下:
   
    #define LOG_TAG "kris_ril"
    #include <utils/Log.h>
   
    然后使用LOGI,LOGD,LOGV,LOGW,LOGE来输出log信息,例如:
   
    LOGI("Rocky:requestRadioPower=%d/n",onOff);
   
    然后在adb shell 中使用
    logcat -s kris_ril
    即可查看到输入结果。
   
方式二:
   
    第一步:在对应的mk文件中加入:LOCAL_LDLIBS := -llog
    第二步:在要使用LOG的cpp文件中加入:
    #include <android/log.h>
    #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, "keymatch", __VA_ARGS__)
    第三步:这样就可以使用了:LOGD("我要看到的调试信息^_^");
 
    这样,在logcat端看到的输出是:
    D/keymatch( 32):我要看到的调试信息^_^
 
    如果想改变输出中的各项内容,可以参考相应颜色的标示,比如,如果想定义LOGE,就可以把上面的ANDROID_LOG_DEBUG改成ANDROID_LOG_ERROR,同理,LOGI什么的也都以此类推:

    #define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, "ProjectName", __VA_ARGS__)
    #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG ,  "ProjectName", __VA_ARGS__)
    #define LOGI(...) __android_log_print(ANDROID_LOG_INFO  ,  "ProjectName", __VA_ARGS__)
    #define LOGW(...) __android_log_print(ANDROID_LOG_WARN  ,  "ProjectName", __VA_ARGS__)
    #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR  , "ProjectName", __VA_ARGS__)
    当然,如果不嫌麻烦,也可以直接使用__android_log_print函数,而不define定义LOGxxx   

 

 

记录了以上两种方法,方便查阅。                                           

Android 开发中,**native 层的 LOG 实现**通常是指在 C/C++ 层(即 Native 层)使用 Android 提供的日志系统进行日志输出。Android 提供了 `android/log.h` 头文件,用于在 Native 层打印日志信息。 --- ## 一、Native 层打印日志的基本方法 Android 提供了一个日志接口 `__android_log_print`,定义在 `<android/log.h>` 中,可以用于在 Native 层输出日志。 ### 示例代码: ```cpp #include <android/log.h> #define LOG_TAG "MyNativeTag" #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) extern "C" JNIEXPORT void JNICALL Java_com_example_myapp_MainActivity_nativeLogExample(JNIEnv *env, jobject /* this */) { LOGD("This is a debug log from native code."); LOGI("This is an info log from native code."); LOGE("This is an error log from native code."); } ``` --- ## 二、解释说明 ### 1. 头文件引入 ```cpp #include <android/log.h> ``` 引入 Android 提供的日志头文件。 ### 2. 定义宏简化调用 ```cpp #define LOG_TAG "MyNativeTag" #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) ``` - `LOG_TAG`:日志标签,用于过滤日志。 - `__android_log_print`:是 Android 提供的 Native 层日志打印函数。 - 支持的日志等级: - `ANDROID_LOG_VERBOSE` - `ANDROID_LOG_DEBUG` - `ANDROID_LOG_INFO` - `ANDROID_LOG_WARN` - `ANDROID_LOG_ERROR` - `ANDROID_LOG_FATAL` ### 3. JNI 函数调用 这段代码是一个 JNI 函数,当 Java 层调用 `nativeLogExample()` 时,会触发 Native 层打印日志。 --- ## 三、Java 层声明 Native 方法 ```java public class MainActivity extends AppCompatActivity { static { System.loadLibrary("native-lib"); } public native void nativeLogExample(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); nativeLogExample(); // 调用 native 方法,触发日志输出 } } ``` --- ## 四、构建配置(CMakeLists.txt) 确保你的 `CMakeLists.txt` 包含了日志库的链接: ```cmake target_link_libraries( native-lib log) # 添加 log 库支持 ``` --- ## 五、查看日志 使用 `logcat` 查看日志: ```bash adb logcat -s MyNativeTag ``` 或者使用 Android Studio 的 Logcat 窗口,设置过滤条件为 `MyNativeTag`。 --- ## 六、注意事项 - 必须链接 `log` 库,否则会报 `undefined reference to '__android_log_print'`。 - 日志级别区分明确,便于调试。 - 日志输出不宜过多,避免影响性能。 - 日志信息不要包含敏感数据,防止信息泄露。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值