android ndk 环境搭建及基本编程思路
本文主要是介绍一下android ndk环境搭建及基本编程思路。
本文测试环境为 Windows Xp3+Eclipse Indigo+jdk6.0+Android2.2+ADT1.6+android+ndk-r7b+Cygwin1.7
一、下载androidndk(以最新版本为准)
您可以下载android-ndk-r7b安装包,下载地址:
地址:http://developer.android.com/sdk/ndk/index.html
下载后解压缩到你的工作目录,例如:C:\Android\android-ndk-r7b,结果如下图:Androidndk包含build、docs、samples、sources、GNUmakefile、ndk-build、ndk-gdb及readme等内容。
其中samples下面包含几个实例开发演示项目。二、下载安装Cygwin
由于ndk开发大都涉及到C/C++在GCC环境下编译、运行,所以在Windows环境下,需要模拟Linux模拟编译环境,下载地址:
http://www.cygwin.com/
下载后是个setup.exe文件,使用过程如下:
第一步:运行setup程序,第一步图略,直接点击Next进入下一步。
第二步:选择安装方式,第一次可以采用Install from Internet在线下载安装,如有现成的离线包,可以选择离线安装(Install from Local Directory)第三步:选择安装目录,比如C:\Android\cygwin,注意此目录是指Cygwin最终的安装目录,不是下载文件暂存目录。
第四步:设置本地包暂存路径暂存目录默认是放到setup.exe的同级目录下,下载后名字类似ftp%3a%2f%2fcygwin.mirrors.pair.com%2f这样格式。
第五步:设置网络连接方式,默认即可。
第六步:选择下载站点地址可以尝试几个看哪个速度快就用哪个地址(如果感觉不快就点取消,再次来过)。
第七步:等待加载安装项载入,选择安装项编译ndk,在默认设置下,只需选择Devel(点击列表中Devel,将后面的Default改为Install,图中红色方框所示),其它均为默认状态。
第八步:等待下载并安装
下载完成后会自动安装到上文设置的安装目录。
第一次下载完成后,最好把下载的包目录做个备份,下次安装同样的环境可以直接使用离线安装方式(第二步中选择本地安装)。三、验证Cygwin环境
安装完成后,先运行Cygwin一次(Cygwin.bat),以便创建一些用户环境文件,分别输入:
make-v和gcc-v
如果安装成功,会有make和gcc相关版本信息打印出来,如下图。四、配置ndk路径设置
可以在cygwin中通过vim修改,也可以在windows安装目录中修改home\<你的用户名>\.bash_profile文件中最后添加环境变量
ndk=/cygdrive/c/Android/android-ndk-r7b
exportndk
其中ndk=/cygdrive/<你的盘符>/<androidndk目录>,"ndk"这个名字随便起,以后经常用不要太长。
重启cygwin,输入:
cd$ndk
可进入ndk对应目录说明设置正常。五、编译演示工程
现在就可以编译相关ndk工程了(一些用c/c++写的程序),编译方法如下:
1、在cygwin命令行下,进入android项目工作目录:
cd$ndk
2、依次进入samples\hello-jni目录,(完整路径示例:C:\Android\android-ndk-r7b\samples\hello-jni)
3、运行
$ndk/ndk-build
注意:该命令$ndk和/ndk-build是连接到一起的,中间没有空格,实际使用时是打入完整的$ndk/ndk-build,不要只打ndk-build。
4、正常编译完成后会在你的项目libs/armeabi目录下生成对应的 libhello-jni.so文件。六、导入静态目标库到Android项目
编译完成后会得到*.so静态目标库后,就可以导入工程环境EclipseAndroid项目中使用,本步骤演示属于ndk目标库+AndriodAPK样式,
此外还有Android源码直接开发、直接编译方式。使用方法如下(示例):
1、在Eclipse中新建一个工程HelloJni,HelloJni.java中的代码可参考ndk对应samples下的演示代码调用方法。
或者直接将samples中的hello-jni导入到Eclipse中。
2、将ndk编译项目目录下的jni和libs文件夹拷贝到新建工程目录下,这两个文件夹要和工程中的src和res文件在同一目录下。
3、运行Eclipse项目,就可以在虚拟机上看到hello-jni.c函数中输出字符串。