天天看點

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 ,

        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