Android studio中NDK开发——JNI层日志打印

Demo下载

链接:https://pan.baidu.com/s/1S605af7NXzBSM9vhTc_f0w

提取码:91rv

Demo 里的 local.properties 的 NDK 路径记得修改。

	ndk.dir=G\:\\android-ndk-r10(=号后面为ndk的解压路径)

Android studio中NDK开发——JNI层日志打印_第1张图片

如何让C的输出能显示在Logcat中

一、前言

JNI层是Java和C/C++的桥梁,在Java层中我们通常会使用Log.v()/Log.e()等来进行日志打印,在C中使用printf方法,但在JNI层这些方法是无法在Android studio中下的Logcat中显示的,需要用到另外的库,这个已经打包在log.h头文件中。

二、步骤

Android studio中NDK开发——JNI层日志打印_第2张图片
其实就是靠这个(liblog.so)so库打印日志

1、配置 Android.mk文件

配置 Android.mk文件 输入 LOCAL_LDLIBS := -llog 打印日志库

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_LDLIBS := -llog

LOCAL_MODULE := ccalljava

LOCAL_SRC_FILES := CCallJava.c

include $(BUILD_SHARED_LIBRARY)

Android studio中NDK开发——JNI层日志打印_第3张图片

2、在C/C++文件,即.c或.cpp文件中引入log.h头文件

#include 

注意:log.h前面还有 “android/”

3、宏定义

#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__)

4、调用宏定义相应的LOGX方法(LOGX 中的 X 代表 I、E、D、W),就可以在C/C++中打印日志

LOGD("DEBUG");
LOGE("ERROR");
LOGI("INFO");
LOGW("WARN");

在代码中要打印日志就要定义出来
Android studio中NDK开发——JNI层日志打印_第4张图片

3. 包含日志头文件, 定义日志输出函数

	#include 

	#define LOG_TAG "atlinweimao"

	#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)

	#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

	#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)

调用 __android_log_print 这个方法打印日志

__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, VA_ARGS)

第一个参数为日志的等级

第二个参数为 TAG:标志

第三个参数为__VA_ARGS__:可变参数

三、例子

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(env,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(env,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;
 
 	jniTest.printLog(LOG_DEBUG, " Debug 级日志信息打印测试");
 	jniTest.printLog(LOG_ERROR, " Error 级日志信息打印测试");
 	jniTest.printLog(LOG_WARN,  " Warn  级日志信息打印测试");
    jniTest.printLog(LOG_INFO,  " Info  级日志信息打印测试");

4、运行一下,就可以在Logcat的不同对应等日志级中看到对应的日志打印信息了

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
修正代码并转载:https://blog.csdn.net/Xiongjiayo/article/details/85758203

你可能感兴趣的:(JNI,java,android,ndk,jni)