软件工程师!
分类: LINUX
2011-09-21 09:53:29
以下为摘自网络对ndk的描述
NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。
NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。
NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。
Google明确声明该API是稳定的,在后续所有版本中都稳定支持当前发布的API。从该版本的NDK中看出,这些API支持的功能非常有限,包含有:C标准库(libc)、标准数学库(libm)、压缩库(libz)、Log库(liblog)。
搭建开发环境
由于android的ndk开发包是在linux上开发生成的,如果需要在windows上运行,则需要使用cywin摸拟linux上的环境进行调用!
注意两个问题:
ndk已提供了完整的工具链,支持交叉编译!
编译时有指定的cpu编译方式,但只能是官方限定的cpu
因为cygwin只是提供一个调用环境,所以不需要安装任何cygwin的开发工具,这儿演示使用的是一个压缩为2M,解压后为7M的mini-cygwin的工具包,在机子上只需要修改一些注册表文件就可以使用!
cygwin的安装目录改变后,则需要更新以上注册的路径信息!
同时设置环境路长路径
当运行以下命令,在cygdrive出现磁盘信息后,则说明调用环境已经做好!
注意一点,在cygwin的环境中访问外部文件都是通过cygwin进行访问!
NDK实现的Android应用程序
以下演示编译的代码是采自最新的android-ndk-r5b中的samples的例子,不采用ide方式编译,直接使用命令行实现!
编译
利用ndk中已经提供了完整的工具链,无须再重新构造工具链,所以只需要调用ndk提供的工具编译sample中的代码即可!
本文使用的例子是native_activity
如下图,进入cygwin的编译环境,输入ndk提供的调用命令,即可实现编译!
当出现以上信息后,则说明编译成功,我们只需关心的是native-activity下的libs的文件夹即可,注意,是整个libs文件夹的布局!
编译成功后,就可以退出cygwin的环境了!
将libs内的文件夹重新拷贝到project的目录中,并改名为lib,如下图所示
以下为重新利用SDK中工具包
生成资源文件R,使用aapt命令
编译生成资源 javac
将R资源生成dalvik格式 dx
打包Manifest资源 aapt
建立无签名的安装包 apkbuilder
对包进行签名 jarsigner
部署
启动摸拟器
使用命令adb 进行安装
安装成功后如图
运行效果图如下
当打包不正确或程序错误时,如下图,我将lib的下的程序目录文称位置改变后安装到摸拟器上崩溃的情景!
崩溃了!
调试
目前使用的只能是ndk下的ndk-gdb,使用介绍略
NDK实现的Android应用程序分析 代码分析主要的源码文件为
android_native_app_glue.h
android_native_app_glue.c
位于$NDK_HOME\sources\android\native_app_glue
以下为摘录
以上两个源码文件的功能为
实现一个显存内存区的绘图内存,并实现各种窗口基本事件(关闭,退出,点击,坐标等)的处理函数,并实现了内存的多线程保护机制.
主activey即main.c
需开发人员实现处理事件的函数回调实现和消息循环体.
通过sample程序的源码来看,利用NDK实现的C++窗口应用程序具有以下特点
v 允许程序员直接操作显存绘图区,框架实现内存区的线程保护
v 框架实现主体消息的处理,程序员必须要实现自已的消息处理函数!
v 不能使用framework的各种自定义组件,但可以通过jni调用组件
v 必须依赖于android系统库功能(实现事件处理,与底层硬件的抽象隔离),即Android app framework
通过以上的命令下将android的ndk程序部署到android上,我们仍可以发现,ndk开发的UI应用程序仍然不算是纯的C++的本地代码,在某些层面仍需要与jni打交道,并且必须要靠manifest文件将其与anroid系统连接起来!
NDK应用程序的性能分析
时间不足,暂略
v 测试程序
v 分析比较
个人小结由于时间关系,暂没有完成两种应用程序的性能比较,但是,从官方文档的资源和一些现在的android的开发情况来看!
推出NDK的目的(摘自官方文档)
The NDK will not benefit most applications. As a developer, you need to balance its benefits against its drawbacks; notably, using native code does not result in an automatic performance increase, but always increases application complexity. In general, you should only use native code if it is essential to your application, not just because you prefer to program in C/C++.
Typical good candidates for the NDK are self-contained, CPU-intensive operations that don't allocate much memory, such as signal processing, physics simulation, and so on. Simply re-coding a method to run in C usually does not result in a large performance increase. When examining whether or not you should develop in native code, think about your requirements and see if the Android framework APIs provide the functionality that you need. The NDK can, however, can be an effective way to reuse a large corpus of existing C/C++ code.
不能支持性能上的提高,并高度依赖于CPU,但能吸引C/C++的开发人员和重用现有的C/C++代码.但使用前还需要慎重考虑!
并且必须维护团队开发的工具链!和承受调试的痛苦~
v NDK不是脱离android的framework的,相离,在应用层方面还是与android的framework紧密集成的!
v C++主要是面对游戏开发者和代码的迁移
v 如果要使用android的控件及平台的功能,还必须通过jni使用
v 代码开发和维护的代价很大
如果在平台中使用ndk作为主要开发语言,对开发进度的影响非常大,并且团队中的人员C++水平参差不齐,很难用C++合作快速开发出高质量的应用程序!
其次,与平台及cpu的连联过于紧密,失去了Dalvik的硬件抽象层保护,adroid上的设备将会越来越多,cpu也会变化,作为