@linux1s1s
2015-06-04T15:07:23.000000Z
字数 2178
阅读 2354
AndroidNDK
前篇博客 Android NDK 开发初步 交代了开发NDK的基本流程,有没有发现每次生成so文件都要经过Bat脚本,这样是不是有点麻烦,能直接配置在Eclipse中自动编译so文件吗,另外C/C++开发调试如何在Eclipse中打印出log?
这篇博客解决上面提出的两个问题
如上配置所示,将NDK的目录配置在Eclipse的NDK Location
,接下来配置自动编译如下所示:
注意这个配置是针对单个Android工程的,需要对单个工程右键Properties设置
这样每次在修改C/C++源文件,保存以后就会自动编译。
这样就配置好了自动编译so文件,接下来配置Native打印Log
先来看看NDK工具文件D:\android-ndk-r9c\samples\native-media\jni
这里面有个非常值得借鉴的文件:Android.mk
和native-media-jni.c
先来看看Google官方给的simples是如何实现打印Log的
打开native-media-jni.c
文件,里面有一份代码:
// for __android_log_print(ANDROID_LOG_INFO, "YourApp", "formatted message");
#include <android/log.h>
#define TAG "NativeMedia"
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)
这个宏定义给出了android中的verbose类型的log,对于这个log.h在哪里,下面给出某个版本的log.h路径
打开这个文件,看一下其中比较有用的枚举
/*
* Android log priority values, in ascending priority order.
*/
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;
所以接着我们也可以定义其他的宏,比如这样:
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN, TAG, __VA_ARGS__)
接着我们将上篇博客中的hello.c加入log信息
#include <stdio.h>
#include <stdlib.h>
#include "com_example_hellondk_MainActivity.h"
// for __android_log_print(ANDROID_LOG_INFO, "YourApp", "formatted message");
#include <android/log.h>
#define TAG "NativeHello"
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)
JNIEXPORT jstring JNICALL Java_com_example_hellondk_MainActivity_getStringFromNative(
JNIEnv * env, jclass jcl) {
LOGV("This is log from Native");
return (*env)->NewStringUTF(env, "Hello from JNI !!! ");
}
接下来保持的时候会报错,error: undefined reference to '__android_log_print'
所以还得引入Log包,如何引入?看看simples是如何做的
打开上面提到的Android.mk
,里面有一句引入log包的配置
# for logging
LOCAL_LDLIBS += -llog
我们配置在HelloNDK工程中如下所示:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello
LOCAL_SRC_FILES := hello.c
# for logging
LOCAL_LDLIBS += -llog
include $(BUILD_SHARED_LIBRARY)
再保存以后,错误就修复了,我们运行一下,看看是否会打印出Log信息:
我们可以看到打印出了log信息,至此前面提及的两个问题都已经解决了。