`

Android利用NDK实现C++开发

 
阅读更多

NDK概述

以下为摘自网络对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环境

以下演示编译的代码是采自最新的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 willnot benefit most applications. As a developer, you need to balance its benefitsagainst its drawbacks; notably, using native code does not result in anautomatic performance increase, but always increases application complexity. Ingeneral, you should only use native code if it is essential to yourapplication, not just because you prefer to program in C/C++.

Typical goodcandidates for the NDK are self-contained, CPU-intensive operations that don'tallocate 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 largeperformance increase. When examining whether or not you should develop innative code, think about your requirements and see if the Android frameworkAPIs provide the functionality that you need. The NDK can, however, can be aneffective way to reuse a large corpus of existing C/C++ code.

不能支持性能上的提高,并高度依赖于CPU,但能吸引C/C++的开发人员和重用现有的C/C++代码.但使用前还需要慎重考虑!

并且必须维护团队开发的工具链!和承受调试的痛苦~

vNDK不是脱离android的framework的,相离,在应用层方面还是与android的framework紧密集成的!

vC++主要是面对游戏开发者和代码的迁移

v如果要使用android的控件及平台的功能,还必须通过jni使用

v代码开发和维护的代价很大

如果在平台中使用ndk作为主要开发语言,对开发进度的影响非常大,并且团队中的人员C++水平参差不齐,很难用C++合作快速开发出高质量的应用程序!

其次,与平台及cpu的连联过于紧密,失去了Dalvik的硬件抽象层保护,adroid上的设备将会越来越多,cpu也会变化,作为通用软件,个人认为不认为ndk适合团队开发!

附:cygwin-lite及编译的代码及安装文件!

分享到:
评论

相关推荐

    Android C++高级编程:使用NDK(高清完整带书签)电子书

    《移动开发经典丛书:Android C++高级编程:使用NDK》提供了移植、开发以及利用Android平台上的C++和其他原生代码所需要的知识和技能,以便于运行图形化的高级应用和更复杂的原生应用。 内容简介  Android是移动...

    《Android C++高级编程——使用NDK》_源码.zip

    《Android C++高级编程——使用NDK》提供了... 《Android C++高级编程——使用NDK》提供了移植、开发以及利用Android平台上的C++和其他原生代码所需要的知识和技能,以便于运行图形化的高级应用和更复杂的原生应用。

    Android C++高级编程使用NDK

    《android c++高级编程:使用NDK》,这是国内首本基于C++开发android应用书籍,由美国程序员辛纳编著。本书内容丰富翔实,提供了移植、开发以及利用Android平台上的C++和其他原生代码所需要的知识和技能,以便于运行...

    android-ndk-r20-linux-x86_64.zip

    NDK:(Native Development Kit),原生开发工具包是一组可以让您在Android应用中利用C和c++代码的工具,可用以从您自己的源代码构建,或者利用现有的预构建库.

    pro-android-c-w-ndk-master.tar

    《移动开发经典丛书:Android C++高级编程:使用NDK》提供了移植、开发以及利用Android平台上的C++和其他原生代码所需要的知识和技能,以便于运行图形化的高级应用和更复杂的原生应用。 内容简介  Android是移动...

    ndk层实现双进程守护

    在linux 下,利用子进程发起建立Socket 连接,保持主进程达到90%保活率,包含完整C++代码和Java代码,注释详细,可直接用于项目开发

    Android应用开发揭秘[PDF高清]

    最重要的是还全面介绍了如何利用原生的C/C++(NDK)和Python、Lua等脚本语言(Android Scripting Environment)来开发Android应用;本书实战性强,书中的每个知识点都有配精心设计的示例,尤为值得一提的是,它还以...

    Android应用开发揭秘(pdf )

    Android应用开发揭秘  Windows操作系统的诞生成就了微软的霸主地位,...如何通过NDK利用C、C++以及通过ASE利用Python等脚本语言Android开发应用?  国内首本基于Android 2.0的经典著作,5大专业社区一致鼎力推荐!

    Android NDK开发的环境搭建与简单示例

    简单来说利用NDK,可以开发纯C&C++的代码,然后编译成库,让利用Android-SDK开发的Java程序调用。NDK开发的可以称之为底层开发或者jni(java native interface)层开发,SDK开发可以称为上层开发。 Android开发中...

    Android应用开发揭秘pdf高清版

    最重要的是还全面介绍了如何利用原生的C,C++(NDK)和Python、Lua等脚本语言(AndroidScriptingEnvironment)来开发Android应用,《Android应用开发揭秘》实战性强,书中的每个知识点都有配精心设计的示例,尤为...

    Android应用开发揭秘

    最重要的是还全面介绍了如何利用原生的C/C++(NDK)和Python、Lua等脚本语言(Android Scripting Environment)来开发Android应用;本书实战性强,书中的每个知识点都有配精心设计的示例,尤为值得一提的是,它还以...

    Android应用开发揭秘 源码 part2

    国内第一本基于Android 2.0...最重要的是还全面介绍了如何利用原生的C/C++(NDK)和Python、Lua等脚本语言(Android Scripting Environment)来开发Android应用;本书实战性强,书中的每个知识点都有配精心设计的示例.

    Android应用开发揭秘高清版(全附带源码).part1

    Android应用开发揭秘高清版(全附带源码).讲解了Android框架、Android组件、用户界面...最重要的是还全面介绍了如何利用原生的C/C++ (NDK)和Python、Lua等脚本语言(Android Scripting Environment)来开发Android应用

    Android应用开发揭秘高清版(全附带源码).part4

    Android应用开发揭秘高清版(全附带源码).讲解了Android框架、Android...等高级知识,最重要的是还全面介绍了如何利用原生的C/C++ (NDK)和Python、Lua等脚本语言(Android Scripting Environment )来开发Android应用

    Android应用开发揭秘高清版(全附带源码).part3

    Android应用开发揭秘高清版(全附带源码).讲解了Android框架、Android...等高级知识,最重要的是还全面介绍了如何利用原生的C/C++ (NDK)和Python、Lua等脚本语言(Android Scripting Environment )来开发Android应用

    Android应用开发揭秘高清版(全附带源码).part2

    Android应用开发揭秘高清版(全附带源码).讲解了Android框架、Android...等高级知识,最重要的是还全面介绍了如何利用原生的C/C++ (NDK)和Python、Lua等脚本语言(Android Scripting Environment )来开发Android应用

    基于C++/java+opencv+dlib开发的变脸android程序+源码+文档说明(毕业设计&课程设计&项目开发)

    基于C++/java+opencv+dlib开发的变脸android程序+源码+文档说明,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于C++/java+opencv+dlib开发的变脸android程序+...

    android 应用开发揭秘

    最重要的是还全面介绍了如何利用原生的C/C++(NDK)和Python、Lua等脚本语言(Android Scripting Environment)来开发Android应用;本书实战性强,书中的每个知识点都有配精心设计的示例,尤为值得一提的是,它还以...

Global site tag (gtag.js) - Google Analytics