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

Demo下载

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

提取码:91rv

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

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

在这里插入图片描述

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

一、前言

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

二、步骤

在这里插入图片描述
其实就是靠这个(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)

在这里插入图片描述

2、在C/C++文件,即.c或.cpp文件中引入log.h头文件
#include <android/log.h>
注意: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");

在代码中要打印日志就要定义出来
在这里插入图片描述

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

	#include <android/log.h>

	#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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值