JNI编程之打印log

来源:互联网 发布:龙华新区离婚网络预约 编辑:程序博客网 时间:2024/05/16 02:49

使用AS开发的过程中经常使用需要各种调试手段,查看log输出正是其中一种。


Java层输出log很简单,只需要使用Log.x(TAG, String); 即可,AS下Alt+Enter键可以很好的帮我们import所依赖的包,这里不再赘述。值得注意的是,为了调试方便,最好为每个java文件定义一个独立的TAG, adb -s TAG可以很好的过滤我们需要的log。


既然Java层下很容易输出log,那么JNI层呢? 是不是也那么容易? 其实不那么容易,笔者在这里就遇到了点小困难,希望为看到这份博客的人解惑。


(1)首先要包含对应的头文件

#include <android/log.h>


(2) 通过查阅log.h文件,发现函数定义的很有“特色”,使用起来很不方便,于是又做了如下改进:

#include <android/log.h>#define TAG "NativeLogTAG"#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG,__VA_ARGS__)#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG,__VA_ARGS__)#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG,__VA_ARGS__)#define LOGW(...) __android_log_print(ANDROID_LOG_WARN, TAG,__VA_ARGS__)#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG,__VA_ARGS__)#define LOGF(...) __android_log_print(ANDROID_LOG_FATAL, TAG,__VA_ARGS__)

如何通过调用对应的宏即可输出各种级别的log。TAG根据具体需要再行定义即可。


(3)然而当尝试编译的时候发现出现如下错误:

undefined reference to `__android_log_print'

其实细心的同学会发现,后面还有link failed之类的错误。显然,这里是因为没有连接对应的库造成的。


只需要在编译的时候使用-l连接对应的库就OK了,那么这就需要需改Android.mk文件。

LOCAL_LDLIBS    := -llog

注意这条语句一定要处在include $(CLEAR_VARS) 之后。


到此就可以使用定义的宏输出log了。



原创粉丝点击