一、NDK简介
1、NDK 全称: Native Development Kit;
为什么推出NDK? 首先 C和C++开发的程序其卓越性能不用提了,其次 C和C++被反编译的可能性降低了很多,要比JAVA安全保密多了,但也有缺点:比如程序更加复杂,兼容性难以保障,无法访问Framework API,Debug难度更大等。开发者需要自行斟酌使用。
2.、ANDROID NDK 带来了什么
a) 一套工具,基于本机编译的C和C++源代码库。
b) 一种部署在ANDROID设备上,可以将so和java一起打包成APK的方法。
c) NDK集成了交叉编译器,并提供了相应的 mk 文件隔离 CPU 、平台、 ABI 等差异,开发人员只需要简单修改 mk 文件(指出“ 哪些文件需要编译 ” 、 “ 编译特性要求 ” 等),就可以创建出 so。
二、搭建Android NDK环境
因为 NDK 要求是 linux 下 开发,如果你
在windows下:你可以选择虚拟机VM,里面装一个 linux系统,可是如果你是在windows上成长起来的,还是选择cygwin吧,至少你不用来回切换窗口了。
下载Android NDK,。下载后直接解压即可。鉴于都属于android 开发,所以最好把其放在android SDK的相同目录下,这样寻找Samples的时候会比较省事。
NDK 编译需要用到Cygwin 中的make 和gcc。
三、部署并 运行hello-jni例子。
1、设置环境变量
第一:首先找到cygwin的安装目录,找到一个home\<你的用户名>\.bash_profile文件,我的是:C:\cygwin\home\wh\.bash_profile
注意:要第一次启动cygwin才会自动生成。
第二: 打开.bash_profile文件,在最后面加入下面这两句话,保存后,重新启动Cygwin。
ANDROID_NDK_ROOT=/cygdrive/<你的盘符>/<android ndk 目录>
export ANDROID_NDK_ROOT
例如:ANDROID_NDK_ROOT=/cygdrive/e/android/android-ndk-r4 (此处表示NDK安装目录),第二句话表示的是添加环境变量。再打开桌面图标Cygwin,在命令行输入:cd $ ANDROID_NDK_ROOT ,注意环境变量的大小写。回车后会定位至你的NDK安装目录。
注意:这里如果是中文OS 使用记事本或者写字板打开编辑后,重新启动Cygwin 会报错。
到此处整个windows下的NDK环境全部搭建完毕。
编译 原生代码 有两种方法可选:
方法一: 在命令行中用ndk-build命令编译原生码生成.so。
1).进入要生成.so的工程目录,比如$ ANDROID_NDK_ROOT/samples/hello-jni,然后执行$ANDROID_NDK_ROOT/ndk-build
安装好NDK之后,最好花上几分钟读一读/docs目录下文档。特别是要完整阅读OVERVIEW.TXT,读完以后你就可以明白NDK的初衷以及如何使用它了。
比如:其中有说明: Previous releases required you to run the 'build/host-setup.sh' script to configure the NDK. However, this step has been removed in release 4 (a.k.a. r4).。
2).在任何地方,执行 $ANDROID_NDK_ROOT/ndk-build -C $ANDROID_NDK_ROOT/samples/hello-jni 如果成功的话,会生libs目录。libs/armeabi目录下有.so文件
3)把samples/hello-jni的hello-jni目录工程拷贝到你的workspace目录下 (用SDK工具,以通常的方式编译应用,SDK的build工具会将.so打包进apk文件) 。
方法二:在Eclipse中配置参数编译原生码生成.so。
1、创建工程,把android代码和、原生的c代码、还有编译 .so 的Andriod.mk 都写好,也就是 整个 工程 只差编译了,。
2、 工程编译 工程目录如下图所
注意:如果使用的NDK是r7之前的版本,必须要安装Cygwin才能使用NDK,因为EC需要配置的builder,其实是执行Cygwin,然后传递ndk-build作为参数。在NDKr7开始,Google的Windows版的NDK提供了一个ndk-build.cmd的脚本,这样,就可以直接利用这个脚本编译,而不需要使用Cygwin了。所以,windows和Linux上都可以类似的使用系统命令行直接进行NDK编译。
既然NDKr7来了,那就不用做Cygwin的配置了。下面是使用NDKr7在windows下配置自动编译的builders的过程,对于Linux,只需要修改ndk-build.cmd为ndk-build即可了。
下面是Main选项卡的配置:
Location为ndk-build.cmd的路径(PS:NDK的安装只需要解压到某一路径即可)。Working Directory,为当前的工程下。这里的${}的表达是使用了EC的环境变量,可以使用Variables...按钮找到一些EC的环境变量。其他的不用配置。
对于Linux上的配置,和这里的配置一样,只是把Location的地址改为ndk-build即可。
下面是Refresh选项卡和Build Options选项卡的配置:
其中,在配置Build Options的时候,点击Specify Resources按钮,选中工程下的jni文件夹如下:
EC就能自动调用NDK脚本编译jni下的C/C++代码了
出来 这个 结果 说明 刚才的配置 正确,并且 已经 自动 把 工程的 原生代码 编译了,并且在 工程 下 ,会生成 libs目录。libs/armeabi目录下有.so文件。
总结:
1、用NDK编译,把编译好的libs(已经编译好了.so),直接拷贝到 eclipse的工程目录下。
2、先在 eclipse里把 整个 android工程建好,并且把 代码写好,然后 配置 以上的自动编译,注意:要把原生代码 和 Android.mk都写好,如下:
-----------------------------------------
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni #需要修改
LOCAL_SRC_FILES := hello-jni.c //需要修改
include $(BUILD_SHARED_LIBRARY)
-----------------------------------------------------