天天看点

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