Android studio中NDK開發(三)——JNI層日誌打印

一、前言

JNI層是Java和C/C++的橋樑,在Java層中我們通常會使用Log.v()/Log.e()等來進行日誌打印,在C中使用printf方法,但在JNI層這些方法是無法在Android studio中下的Logcat中顯示的,需要用到另外的庫,這個已經打包在log.h頭文件中。
 

二、步驟

1、在C/C++文件,即.c或.cpp文件中引入log.h頭文件
#include <android/log.h>
注意:log.h前面還有 “android/” 
2、宏定義
#define  LOGI(...) __android_log_print(ANDROID_LOG_INFO, "========= Info =========   ", __VA_ARGS__)
 
#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR, "========= Error =========   ", __VA_ARGS__)
 
#define  LOGD(...)  __android_log_print(ANDROID_LOG_INFO, "========= Debug =========   ", __VA_ARGS__)
 
#define  LOGW(...)  __android_log_print(ANDROID_LOG_WARN, "========= Warn =========   ", __VA_ARGS__)
3、調用宏定義相應的LOGX方法(LOGX 中的 X 代表 I、E、D、W),就可以在C/C++中打印日誌
LOGD("DEBUG");
LOGE("ERROR");
LOGI("INFO");
LOGW("WARN");
 

三、例子

1、在Java層中聲明一個native方法,用來打印日誌
 public native void printLog(int logLevel, String logString);
2、在C/C++文件中實現native方法
extern "C" JNIEXPORT void JNICALL
Java_com_example_hasee_ndkdemo_NDKUtil_printLog(
        JNIEnv *env,
        jobject /*this*/,
        jint logLevel,
        jstring logString){
 
    //jstring類型的方法需要先轉爲char類型
    const char* str = env->GetStringUTFChars(logString,0);
    //根據不同的打印等級打印不同的信息
    switch (logLevel){
        case 1:
            LOGD("DEBUG————  %s",str);
            break;
        case 2:
            LOGW("WARN————  %s",str);
            break;
        case 3:
            LOGI("INFO————  %s",str);
            break;
        case 4:
            LOGE("ERROR————  %s",str);
            break;
        default:
            LOGI("INFO————  %s",str);
    }
    //要記得釋放str所佔用的內存空間
    env->ReleaseStringUTFChars(logString,str);
 
3、在Java層中就可以對native方法進行調用來打印日誌了
   //日誌打印等級
    public static final int LOG_DEBUG = 1;
    public static final int LOG_ERROR = 2;
    public static final int LOG_WARN  = 3;
    public static final int LOG_INFO= 4;
 
    ndkUtil.printLog(LOG_DEBUG, " Debug 級日誌信息打印測試");
    ndkUtil.printLog(LOG_ERROR, " Error 級日誌信息打印測試");
    ndkUtil.printLog(LOG_WARN,  " Warn  級日誌信息打印測試");
    ndkUtil.printLog(LOG_INFO,  " Info  級日誌信息打印測試");
4、運行一下,就可以在Logcat的不同對應等日誌級中看到對應的日誌打印信息了


 

如有錯誤,歡迎指出,虛心學習!
————————————————
版權聲明:本文爲CSDN博主「Xiongjiayo」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/Xiongjiayo/article/details/85758203

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