当前位置:   article > 正文

Android studio中NDK开发——JNI层日志打印_android studio jni log输出到logcat

android studio jni log输出到logcat

Demo下载

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

提取码:91rv

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

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

在这里插入图片描述

如何让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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在这里插入图片描述

2、在C/C++文件,即.c或.cpp文件中引入log.h头文件
#include <android/log.h>
  • 1
注意: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__)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
4、调用宏定义相应的LOGX方法(LOGX 中的 X 代表 I、E、D、W),就可以在C/C++中打印日志
LOGD("DEBUG");
LOGE("ERROR");
LOGI("INFO");
LOGW("WARN");
  • 1
  • 2
  • 3
  • 4

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

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__)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

调用 __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);
  • 1
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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
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  级日志信息打印测试");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
4、运行一下,就可以在Logcat的不同对应等日志级中看到对应的日志打印信息了

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/133154
推荐阅读
相关标签
  

闽ICP备14008679号