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對應Java的Log.v()函數
ANDROID_LOG_DEBUG
對應Java的Log.d()函數
ANDROID_LOG_INFO
對應Java的Log.i()函數
ANDROID_LOG_WARN對應Java的Log.w()函數
ANDROID_LOG_ERROR
對應Java的Log.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.out和System.err函數輸出的內容都會顯示在控制檯裏面,如果我們想把這兩個函數輸出的內容重定向到Android的日誌裏面,我們可以在Android Studio的命令行窗口輸入如下命令:
adb shell setprop log.redirect-stdio
true
adb shell stop
adb shell start
結束語
熟練使用Android的日誌函數,可以幫助我們快速的定位問題,雖然我們可以通過Android Studio直接調試C/C++代碼,但是有時候日誌可能會更有幫助。