android-jni 之 环境搭建

一、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、 工程编译 工程目录如下图所


右键 选择当前项目hellojni -> Build path ->  config build path -> Builders -> new选择program在新建Builder中进行如下配置

注意:如果使用的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)

-----------------------------------------------------








posted @ 2012-12-04 21:27  点点爱梦  阅读(128)  评论(0编辑  收藏  举报