一般在 JNI 层输出 Android log 时,不会直接使用原生的接口,而是做一层简单的封装。
我们希望输出一种带有 文件名、方法名、行号 等信息的 Android log,可以帮组我们更加快速的定位 log 是在何处输出的。
并且,我们希望可以很轻松的控制 log 的打开和关闭。
如果想要关掉 log,注释掉 #define DEBUG 的定义就行。当然更好的做法是动态的定义这个宏。
#ifndef _LOG_UTILS_H_
#define _LOG_UTILS_H_
#include
#include
#define DEBUG // 可以通过 CmakeLists.txt 等方式来定义在这个宏,实现动态打开和关闭LOG
// Windows 和 Linux 这两个宏是在 CMakeLists.txt 通过 ADD_DEFINITIONS 定义的
#ifdef Windows
#define __FILENAME__ (strrchr(__FILE__, '\\') + 1) // Windows下文件目录层级是'\\'
#elif Linux
#define __FILENAME__ (strrchr(__FILE__, '/') + 1) // Linux下文件目录层级是'/'
#else
#define __FILENAME__ (strrchr(__FILE__, '/') + 1) // 默认使用这种方式
#endif
#ifdef DEBUG
#define TAG "JNI"
#define LOGV(format, ...) __android_log_print(ANDROID_LOG_VERBOSE, TAG,\
"[%s][%s][%d]: " format, __FILENAME__, __FUNCTION__, __LINE__, ##__VA_ARGS__);
#define LOGD(format, ...) __android_log_print(ANDROID_LOG_DEBUG, TAG,\
"[%s][%s][%d]: " format, __FILENAME__, __FUNCTION__, __LINE__, ##__VA_ARGS__);
#define LOGI(format, ...) __android_log_print(ANDROID_LOG_INFO, TAG,\
"[%s][%s][%d]: " format, __FILENAME__, __FUNCTION__, __LINE__, ##__VA_ARGS__);
#define LOGW(format, ...) __android_log_print(ANDROID_LOG_WARN, TAG,\
"[%s][%s][%d]: " format, __FILENAME__, __FUNCTION__, __LINE__, ##__VA_ARGS__);
#define LOGE(format, ...) __android_log_print(ANDROID_LOG_ERROR, TAG,\
"[%s][%s][%d]: " format, __FILENAME__, __FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
#define LOGV(format, ...);
#define LOGD(format, ...);
#define LOGI(format, ...);
#define LOGW(format, ...);
#define LOGE(format, ...);
#endif // DEBUG
#endif // _LOG_UTILS_H_
在 CmakeLists.txt 中添加如下代码:
IF (${CMAKE_HOST_SYSTEM_NAME} MATCHES "Windows")
ADD_DEFINITIONS(-DWindows)
ELSE (${CMAKE_HOST_SYSTEM_NAME} MATCHES "Linux")
ADD_DEFINITIONS(-DLinux)
ENDIF ()
使用方式和 prinft 等函数一样。
LOGD("hello world");
LOGD("%d", 10);
LOGD("%s : %d", "num", 20);
LOGD();
最终效果将是:[文件名][方法名][行号]: format... 的形式,例如
[main.cpp][main][5]: hello world
[main.cpp][main][6]: 10
[main.cpp][main][7]: num : 20
[main.cpp][main][8]:
NDK 学习系列:Android NDK 从入门到精通(汇总篇)