Android NDK日誌篇(二)

Android NDK日誌篇

前言

本篇重要介紹一下NDK的日誌相關的函數,學會了日誌函數,可以幫助我們快速的定位問題,解決問題。

注意事項

NDK日誌頭文件

#include<android/log.h>

Android Studio配置

CMakeLists.txt文件裏面添加如下代碼:

target_link_libraries( native-lib
                         log )

第一個參數是你的JNI庫的名字

其中第二個參數log代表NDK目錄下面的liblog.so文件

NDK日誌函數

NDK日誌級別

typedef enum android_LogPriority {

    ANDROID_LOG_UNKNOWN = 0,

    ANDROID_LOG_DEFAULT,    /* only for SetMinPriority() */

    ANDROID_LOG_VERBOSE,

    ANDROID_LOG_DEBUG,

    ANDROID_LOG_INFO,

    ANDROID_LOG_WARN,

    ANDROID_LOG_ERROR,

    ANDROID_LOG_FATAL,

    ANDROID_LOG_SILENT,     /* only for SetMinPriority(); must be last */

} android_LogPriority;

常用的NDK日誌級別:

ANDROID_LOG_VERBOSE對應JavaLog.v()函數
    ANDROID_LOG_DEBUG
對應JavaLog.d()函數
    ANDROID_LOG_INFO
對應JavaLog.i()函數
    ANDROID_LOG_WARN
對應JavaLog.w()函數
    ANDROID_LOG_ERROR
對應JavaLog.e()函數
    ANDROID_LOG_FATAL
這個是最嚴重的致命級別的錯誤,Java沒有對應的日誌函數和它對應,這個就相當於增強版的Log.e()函數

NDK日誌函數

int __android_log_write(int prio, const char *tag, const char *text);
 
int __android_log_print(int prio, const char *tag,  const char *fmt, ...)
 
int __android_log_vprint(int prio, const char *tag, const char *fmt, va_list ap);

 

prio參數代表日誌的優先級,對應於android_LogPriority結構體

tag參數就是日誌的Tag

text參數就是要輸出的日誌的文件

fmt參數就是要輸出的日誌的格式

...ap參數就是要輸出的日誌的參數列表

示例如下:

extern "C"
JNIEXPORT void JNICALL
Java_com_kgdwbb_jnidemo_MainActivity_logTest(JNIEnv *env,jobject thiz) {
    __android_log_write(
ANDROID_LOG_VERBOSE,"hello","helloworld");
    __android_log_print(
ANDROID_LOG_VERBOSE,"hello","hello %s","world");
}

Java控制檯日誌重定向

一般情況下Java通過System.outSystem.err函數輸出的內容都會顯示在控制檯裏面,如果我們想把這兩個函數輸出的內容重定向到Android的日誌裏面,我們可以在Android Studio的命令行窗口輸入如下命令:

adb shell setprop log.redirect-stdio true
adb shell stop
adb shell start

結束語

熟練使用Android的日誌函數,可以幫助我們快速的定位問題,雖然我們可以通過Android Studio直接調試C/C++代碼,但是有時候日誌可能會更有幫助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章