[关闭]
@linux1s1s 2015-06-04T07:07:23.000000Z 字数 2178 阅读 1739

Android NDK Eclipse开发配置

AndroidNDK


前篇博客 Android NDK 开发初步 交代了开发NDK的基本流程,有没有发现每次生成so文件都要经过Bat脚本,这样是不是有点麻烦,能直接配置在Eclipse中自动编译so文件吗,另外C/C++开发调试如何在Eclipse中打印出log?

这篇博客解决上面提出的两个问题

Eclipse 自动编译so

此处输入图片的描述

如上配置所示,将NDK的目录配置在Eclipse的NDK Location,接下来配置自动编译如下所示:

此处输入图片的描述
注意这个配置是针对单个Android工程的,需要对单个工程右键Properties设置
此处输入图片的描述
这样每次在修改C/C++源文件,保存以后就会自动编译。
此处输入图片的描述
这样就配置好了自动编译so文件,接下来配置Native打印Log

配置Native打印出Log

先来看看NDK工具文件D:\android-ndk-r9c\samples\native-media\jni
这里面有个非常值得借鉴的文件:Android.mknative-media-jni.c
先来看看Google官方给的simples是如何实现打印Log的
打开native-media-jni.c文件,里面有一份代码:

  1. // for __android_log_print(ANDROID_LOG_INFO, "YourApp", "formatted message");
  2. #include <android/log.h>
  3. #define TAG "NativeMedia"
  4. #define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)

这个宏定义给出了android中的verbose类型的log,对于这个log.h在哪里,下面给出某个版本的log.h路径

此处输入图片的描述

打开这个文件,看一下其中比较有用的枚举

  1. /*
  2. * Android log priority values, in ascending priority order.
  3. */
  4. typedef enum android_LogPriority {
  5. ANDROID_LOG_UNKNOWN = 0,
  6. ANDROID_LOG_DEFAULT, /* only for SetMinPriority() */
  7. ANDROID_LOG_VERBOSE,
  8. ANDROID_LOG_DEBUG,
  9. ANDROID_LOG_INFO,
  10. ANDROID_LOG_WARN,
  11. ANDROID_LOG_ERROR,
  12. ANDROID_LOG_FATAL,
  13. ANDROID_LOG_SILENT, /* only for SetMinPriority(); must be last */
  14. } android_LogPriority;

所以接着我们也可以定义其他的宏,比如这样:

  1. #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)
  2. #define LOGW(...) __android_log_print(ANDROID_LOG_WARN, TAG, __VA_ARGS__)

接着我们将上篇博客中的hello.c加入log信息

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "com_example_hellondk_MainActivity.h"
  4. // for __android_log_print(ANDROID_LOG_INFO, "YourApp", "formatted message");
  5. #include <android/log.h>
  6. #define TAG "NativeHello"
  7. #define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)
  8. JNIEXPORT jstring JNICALL Java_com_example_hellondk_MainActivity_getStringFromNative(
  9. JNIEnv * env, jclass jcl) {
  10. LOGV("This is log from Native");
  11. return (*env)->NewStringUTF(env, "Hello from JNI !!! ");
  12. }

接下来保持的时候会报错,error: undefined reference to '__android_log_print'
所以还得引入Log包,如何引入?看看simples是如何做的

打开上面提到的Android.mk,里面有一句引入log包的配置

  1. # for logging
  2. LOCAL_LDLIBS += -llog

我们配置在HelloNDK工程中如下所示:

  1. LOCAL_PATH := $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_MODULE := hello
  4. LOCAL_SRC_FILES := hello.c
  5. # for logging
  6. LOCAL_LDLIBS += -llog
  7. include $(BUILD_SHARED_LIBRARY)

再保存以后,错误就修复了,我们运行一下,看看是否会打印出Log信息:

此处输入图片的描述

我们可以看到打印出了log信息,至此前面提及的两个问题都已经解决了。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注