1. 环境准备与基础配置
在 Android 开发中,JNI(Java Native Interface)是连接 Java 和 C++ 代码的桥梁,尤其在处理高性能计算或底层操作时非常实用。开发者在 C++ 层打印 Logcat 日志时常遇到性能问题或配置错误,以下是一套高效且稳定的配置方案。
首先,确保开发环境正确配置。打开 Android Studio,在 SDK Manager 中安装 NDK(Native Development Kit)和 CMake。NDK 版本建议选择最新稳定版,避免兼容性问题。CMake 则是构建 C++ 代码的核心工具,以下是一个基础的 CMakeLists.txt 配置:
cmake_minimum_required(VERSION 3.10.2) project("native-log") add_library(native-lib SHARED src/main/cpp/native-lib.cpp) find_library(log-lib log) target_link_libraries(native-lib ${log-lib})
这里的关键是 find_library 和 target_link_libraries,它们确保了 C++ 代码能链接到 Android 的日志库。如果漏掉这一步,编译时不会报错,但运行时会无法打印日志。
2. 高效日志宏封装
直接调用 __android_log_print 函数不仅代码冗长,还影响可读性。建议使用宏封装不同级别的日志输出,这样既能简化代码,又能统一管理日志行为。以下是项目中常用的宏定义:
#include <android/log.h>
#define LOG_TAG "NativeLog"
#define LOG_DEBUG true // 全局控制调试日志开关
#if LOG_DEBUG
#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__)
#else
#define LOGD(...) ((void)0)
#define LOGI(...) ((void)0)
#define LOGE(...) ((void)0)
#endif
这种封装有三大优势:一是通过 LOG_DEBUG 全局开关可在发布版本中彻底关闭调试日志,避免性能损耗;二是使用不同宏区分日志级别,方便在 Logcat 中过滤;三是减少重复代码,让业务逻辑更清晰。实际使用时,只需这样调用:
LOGD("Native log test");

