1. 程式人生 > >Android中Jni學習總結--Jni中列印log資訊

Android中Jni學習總結--Jni中列印log資訊

一、在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" :使用者自定義的標頭檔案,編譯器會在使用者目錄下優先查詢,找不到在找系統目錄