Android NDK开发环境的配置

版权声明:本文为博主原创文章,转载请务必注明作者与原文链接。 https://blog.csdn.net/jingerppp/article/details/26251421

网上有很多参考文献,当初我搭建环境的时候,也参考了很多,但是还是想结合自己的经验做一个总结。

 一、NDK产生的背景

  Android平台从诞生起,就已经支持C、C++开发。众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三方应用都必须使用Java语言。但这并不等同于“第三方应用只能使用Java”。在Android SDK首次发布时,Google就宣称其虚拟机Dalvik支持JNI编程方式,也就是第三方应用完全可以通过JNI调用自己的C动态库,即在Android平台上,“Java+C”的编程方式是一直都可以实现的。

  不过,Google也表示,使用原生SDK编程相比Dalvik虚拟机也有一些劣势,Android SDK文档里,找不到任何JNI方面的帮助。即使第三方应用开发者使用JNI完成了自己的C动态链接库(so)开发,但是so如何和应用程序一起打包成apk并发布?这里面也存在技术障碍。比如程序更加复杂,兼容性难以保障,无法访问Framework API,Debug难度更大等。开发者需要自行斟酌使用。

  于是NDK就应运而生了。NDK全称是Native Development Kit。

  NDK的发布,使“Java+C”的开发方式终于转正,成为官方支持的开发方式。NDK将是Android平台支持C开发的开端。

二、为什么使用NDK

  1.代码的保护。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。

  2.可以方便地使用现存的开源库。大部分现存的开源库都是用C/C++代码编写的。

  3.提高程序的执行效率。将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。

  4.便于移植。用C/C++写得库可以方便在其他的嵌入式平台上再次使用。

三、NDK简介

       1.NDK是一系列工具的集合

       NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。

NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。

NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。

       2.NDK提供了一份稳定、功能有限的API头文件声明

       Google明确声明该API是稳定的,在后续所有版本中都稳定支持当前发布的API。从该版本的NDK中看出,这些API支持的功能非常有限,包含有:C标准库(libc)、标准数学库(libm)、压缩库(libz)、Log库(liblog)

四、NDK开发环境的搭建

1.下载安装Android NDK

地址:http://developer.android.com/sdk/ndk/index.html

2.下载安装cygwin

由于NDK编译代码时必须要用到make和gcc,所以你必须先搭建一个linux环境, cygwin是一个在windows平台上运行的unix模拟环境,它对于学习unix/linux操作环境,或者从unix到windows的应用程序移植,非常有用。通过它,你就可以在不安装linux的情况下使用NDK来编译C、C++代码了。下载地址:http://www.cygwin.com

a、通过上面的下载地址,下载客户端

点击setup-x86 64.exe,我系统是64位的,根据情况而定。

b、下载好setup-x86_64.exe后运行

c、选择安装方式。第一次可以采用Direct Connection在线下载安装,如有现成的离线包,可以选择离线安装(Install from Local Directory)。

d、选择安装目录。

e、设置本地包暂存路径。暂存目录默认是放到setup.exe的同级目录下,建议放到指定的文件夹,如D:\Cygwin_install_file。安装完成后把这个文件夹打包备份,以后再配置时不用重新下载。

f、设置网络连接方式。这个目前河蟹没爬过来,选第一个即可。

g、选择下载站点地址。据说国内163站点的速度不错,我也是用的这个。

h、等待加载安装项载入,选择安装项。点击Devel-Default,使之变成Devel-Install,展开后可以看到其下的子项被选中了(网上多数教程都说选中某12个包,找起来太坑爹了,直接全下载了吧,全选多了150M左右)。此界面其他设置都不用动。

i、等待下载完成。

测试一下cygwin是不是已经安装好了。

      运行cygwin,在弹出的命令行窗口输入:cygcheck -c cygwin命令,会打印出当前cygwin的版本和运行状 态,如果status是ok的话,则cygwin运行正常。

      然后依次输入gcc –version,g++ --version,make –version,gdb –version进行测试,如果都打印出版本信息和一些描述信息,则cygwin安装成功!

3. 配置 NDK 环境变量

cygwin配置ok后,需要配置NDK的路径。cygwin的根目录下有个名叫Cygwin.bat的文件,运行后会在cygwin的根目录下有个home的目录,里面有个名叫.bash_profile的文件,打开后设置一下NDK的path,例如NDK=/cygdrive/d/shift/mysoftware/android-ndk-r9d

保存后退出,再次进入cygwin后,cd $NDK进入ndk的目录则说明这里设置NDK的环境是ok了。

4. 配置 C/C++ 的编译器

    a.打开 eclipse ,导入ndk 自带的hello-jni 例子,右键单击项目名称,点击 Properties ,弹出配置界面,之后再点击 Builders ,弹出项目的编译工具列表,之后点击 New,新添加一个编译器,点击后出现添加界面,选择 Program ,点击 OK。

    b.出现了添加界面,首先给编译配置起个名字,如: C_Builder,设置 Location 为 < 你 cygwin 安装路径 >\bin\bash.exe 程序,例:C:\cygwin64\bin\bash.exe,设置Working Directory为<你 cygwin 安装路径 >\bin 目录,例如:C:\cygwin64\bin,设置 Arguments 为 --login -c "cd /cygdrive/d/shift/mysoftware/android-ndk-r9d/samples/hello-jni && $ANDROID_NDK_ROOT/ndk-build"

    c.接着切换到 Refresh 选项卡,给 Refresh resources upon completion 打上钩

    d.然后切换到 Build Options 选项卡,勾选上最后三项

 e.之后点击 Specify Resources 按钮,选择资源目录,勾选你的项目目录即可

 f.最后点击 Finish,点击 OK 一路把刚才的配置都保存下来,注意:如果你配置的编译器在其它编译器下边,记得一定要点 Up 按钮,把它排到第一位,否则 C 代码的编译晚于Java代码的编译,会造成你的 C 代码要编译两次才能看到最新的修改。

 g.编译配置也配置完成啦,现在来测试一下是否可以自动编译呢,打开项目 jni 目录里的 hello-jni.c 文件把提示 Hello from JNI! 改成其他的文字:如: Hello , My name is alex. ,然后再模 拟器中运行你的程序,如果模拟器中显示了你最新修改的文字,那么 Congratulations !你已经全部配置成功啦!

小结:

1. 刚开始的时候以为用NDK单独编译c/c++文件是不行的,会弹出:

Android NDK: Could not find application project directory !    
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it. 

我感觉貌似这个是需要配合java的app一起编译的,后来无意间发现只要将source code放在jni目录下进行编译就ok了。

个人觉得还是minGW好使。

2. 个人觉得,c/c++的编译环境不需要单独配置也是ok的,看个人喜好

具体步骤:

    a、在eclipse中已经存在的项目中建一个目录,命名为jni

    b、将native部分的code已经Android.mk放到jni目录下

    c、打开cygwin,cd到当前的jni目录下,执行$ANDROID_NDK_ROOT/ndk-build,这样就会在eclipse的项目中生成so

    d、这样运行这个app,就会同样加载so到app中,运行的结果如下(说明是ok的)

参考文献:

http://www.cnblogs.com/devinzhang/archive/2012/02/29/2373729.html

http://www.cnblogs.com/baronzhao/archive/2012/07/10/2585181.html

猜你喜欢

转载自blog.csdn.net/jingerppp/article/details/26251421