NDK 应用及扩展 Android NDK 作用主要用来编译本地库(由C,C++文件编译后运行于目标CPU 的库)给Android java 调用,同时,可以用来打包编译动态库和静态库,但不能将本地库和java 文件打包成APK(这是别的范畴,后面有简单实现这功能的方法). 本例子主要介绍如何使用NDK 编译出动态库(.so)和静态库(.a),并且在编译它们的时候又调用其他的动态库或静态库,并且将其他的库打包成最终的一个库文件.so 给java 调用. 最后简单说明其他实现编译so 文件的方法,打包so 到apk 里的方法. NDK 内部变量说明请参考<【eoe 特刊】第七期:NDK>.pdf 文件. 本例子是在ubuntu9.04 上使用android-ndk-1.6_r1-linux-x86 和android-sdk-linux_x86_16. 1. 安装. a) Tar –jxvf android-ndk-1.6_r1-linux-x86.tar.bz2 得到android-ndk-1.6_r1 文件夹 b) 将android-ndk-1.6_r1 文件夹放到你要的位置,进入 android-ndk-1.6_r1 文件夹,此时的pwd 就是NDK 的根目录,我定义为$NDK_ROOT, c) 在$NDK_ROOT 执行命令 ./build/host-setup.sh ,能成功安装 DNK 环境.(如果有问题,请按提示添加系统缺失文件) 2. 编译一个动态库和一个静态库. a) 在$NDK_ROOT 目录下进入 apps 文件夹,创建 jni 文件夹和Application.mk 文件,其内容如下 APP_PROJECT_PATH := $(call my-dir) APP_MODULES := testapi testapi 是生产模块的主要名字, ( 此版本系统默认编译$ APP_PROJECT_PATH 下 jni 文件夹下的c,c++文件) b) 进入 jni 文件夹,创建 add.c,add.h,Android.mk 内容分别如下: i. add.h: #ifndef ADD_H #define ADD_H extern int add(int x, int y); #endif /* ADD_H */ ii. add.c #include "add.h" int add(int x, int y){ return x + y; } iii. Android.mk LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := testapi LOCAL_SRC_FILES := add.c LOCAL_PRELINK_MODULE := false include $(BUILD_SHARED_LIBRARY) iv. 回到$NDK_ROOT 目录,命令行输入 make APP=api 编译成功, 在$NDK_ROOT/apps/api/libs/armeabi 得到动态库 libtestapi.so, 3147Btye v. 将Android.mk 最后一样修改成 include $(BUILD_STATIC_LIBRARY) 在$NDK_ROOT 目录,命令行输入 make APP=api 编译成功,在$NDK_ROOT/out/apps/api/得到静态库 libtestapi.a, ...