Android中Jni學習總結--Jni中列印log資訊
阿新 • • 發佈:2019-01-12
一、在jni中c++層進行log的列印
1、在需要使用log的cpp檔案中加入
#include <android/log.h>
2、在需要列印的地方直接呼叫
__android_log_print(ANDROID_LOG_INFO,"test","value is %d\n",a);
二、常用日誌函式
android/log.h標頭檔案也聲明瞭一系列函式,這些函式主要用於原生程式碼生成日誌訊息。
1、 _android_log_write:可用於生成一個簡單的字串作為日誌資訊
_android_log_write(ANDROID_LOG_WARN,"hello-jni","warning log.");
2、 _android_log_print:可以用於生成一個格式化字串作為日誌訊息。
_android_log_print(ANDROID_LOG_ERROR,"hello-jni","Failed with errno%d",erron);
3、 _android_log_vprint:除了引數傳遞方式外,其他功能與_android_log_print完全相同,_android_log_vprint函式用va_list傳遞附加引數,而_android_log_print函式中已連續引數的方式改為傳遞引數。
va_list args; va_start(args,format); _android_log_vprint(ANDROID_LOG_VERBOSS,"hello-jni",format,args);
4、 _android_log_assert:用於記錄斷言失敗,它不包括日誌優先順序,將所有日誌記錄為fatal
if(0 != erron){
_android_log_assert("0!=errno","hello-jni","There is an errno");
}
三、需要改進的地方
1、每次直接 __android_log_print 比較麻煩,可預先在檔案中定義,示例:
#define TAG "tagName" #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG ,__VA_ARGS__) // 定義LOGD型別 #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,TAG ,__VA_ARGS__) // 定義LOGI型別 #define LOGW(...) __android_log_print(ANDROID_LOG_WARN,TAG ,__VA_ARGS__) // 定義LOGW型別 #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,TAG ,__VA_ARGS__) // 定義LOGE型別 #define LOGF(...) __android_log_print(ANDROID_LOG_FATAL,TAG ,__VA_ARGS__) // 定義LOGF型別
2、每次呼叫使用不同的 tag 的方法
#define LOG(tag,...) __android_log_print(ANDROID_LOG_FATAL,tag,__VA_ARGS__) // 定義LOG型別
3、可以將上述方式定義在一個 .h 標頭檔案中,示例:定義在 logutils.h
#include <android/log.h>
#ifndef JNIDEMO3_LOGUTILS_H #define JNIDEMO3_LOGUTILS_H
#define LOGD(TAG,...) __android_log_print(ANDROID_LOG_DEBUG,TAG ,__VA_ARGS__) // 定義LOGD型別
#define LOGI(TAG,...) __android_log_print(ANDROID_LOG_INFO,TAG ,__VA_ARGS__) // 定義LOGI型別
#define LOGW(TAG,...) __android_log_print(ANDROID_LOG_WARN,TAG ,__VA_ARGS__) // 定義LOGW型別
#define LOGE(TAG,...) __android_log_print(ANDROID_LOG_ERROR,TAG ,__VA_ARGS__) // 定義LOGE型別
#define LOGF(TAG,...) __android_log_print(ANDROID_LOG_FATAL,TAG ,__VA_ARGS__) // 定義LOGF型別
#endif //JNIDEMO3_LOGUTILS_H
在需要引用的地方呼叫 #include “logutils.h”
PS: include 之後雙引號和尖括號的區別
#include <jni.h> :系統自帶的標頭檔案用尖括號引用,編譯器會在系統目錄下查詢
#include "logutils.h" :使用者自定義的標頭檔案,編譯器會在使用者目錄下優先查詢,找不到在找系統目錄