Android NDK日志篇(二)

来源:互联网 发布:淘宝店铺怎么贷款 编辑:程序博客网 时间:2024/05/22 15:58

Android NDK日志篇

前言

本篇重要介绍一下NDK的日志相关的函数,学会了日志函数,可以帮助我们快速的定位问题,解决问题。

注意事项

NDK日志头文件

#include<android/log.h>

Android Studio配置

CMakeLists.txt文件里面添加如下代码:

target_link_libraries( native-lib
                         log )

第一个参数是你的JNI库的名字

其中第二个参数log代表NDK目录下面的liblog.so文件

NDK日志函数

NDK日志级别

typedef enum android_LogPriority {    ANDROID_LOG_UNKNOWN = 0,    ANDROID_LOG_DEFAULT,    /* only for SetMinPriority() */    ANDROID_LOG_VERBOSE,    ANDROID_LOG_DEBUG,    ANDROID_LOG_INFO,    ANDROID_LOG_WARN,    ANDROID_LOG_ERROR,    ANDROID_LOG_FATAL,    ANDROID_LOG_SILENT,     /* only for SetMinPriority(); must be last */} android_LogPriority;

常用的NDK日志级别:

ANDROID_LOG_VERBOSE对应JavaLog.v()函数
    ANDROID_LOG_DEBUG
对应JavaLog.d()函数
    ANDROID_LOG_INFO
对应JavaLog.i()函数
    ANDROID_LOG_WARN
对应JavaLog.w()函数
    ANDROID_LOG_ERROR
对应JavaLog.e()函数
    ANDROID_LOG_FATAL
这个是最严重的致命级别的错误,Java没有对应的日志函数和它对应,这个就相当于增强版的Log.e()函数

NDK日志函数

int __android_log_write(int prio, const char *tag, const char *text);
 
int __android_log_print(int prio, const char *tag,  const char *fmt, ...)
 
int __android_log_vprint(int prio, const char *tag, const char *fmt, va_list ap);

 

prio参数代表日志的优先级,对应于android_LogPriority结构体

tag参数就是日志的Tag

text参数就是要输出的日志的文件

fmt参数就是要输出的日志的格式

...ap参数就是要输出的日志的参数列表

示例如下:

extern"C"
JNIEXPORTvoidJNICALL
Java_com_kgdwbb_jnidemo_MainActivity_logTest(JNIEnv*env,jobjectthiz) {
    __android_log_write(
ANDROID_LOG_VERBOSE,"hello","helloworld");
    __android_log_print(
ANDROID_LOG_VERBOSE,"hello","hello%s","world");
}

Java控制台日志重定向

一般情况下Java通过System.outSystem.err函数输出的内容都会显示在控制台里面,如果我们想把这两个函数输出的内容重定向到Android的日志里面,我们可以在Android Studio的命令行窗口输入如下命令:

adb shell setprop log.redirect-stdiotrue
adb shell stop
adb shell start

结束语

熟练使用Android的日志函数,可以帮助我们快速的定位问题,虽然我们可以通过Android Studio直接调试C/C++代码,但是有时候日志可能会更有帮助。