一、前言
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