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