`

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-ndk(android-ndk-r26b-windows.zip)

    Android NDK,全称为Native Development Kit,是Google提供的一款用于Android平台的C和C++开发工具集。这个压缩包“android-ndk-r26b-windows.zip”包含了NDK的第26个版本,专为Windows操作系统设计。通过这个工具,...

    android-ndk(android-ndk-r25b-windows.zip)

    Android NDK,全称为Native Development Kit,是Google提供的一款用于Android平台的C和C++开发工具集。这个压缩包“android-ndk-r25b-windows.zip”包含了NDK的第25个版本,专为Windows操作系统设计。NDK的主要功能...

    android-ndk(android-ndk-r23b-windows.zip)

    Android NDK,全称为Native Development Kit,是Google提供的一款用于Android平台的C/C++开发工具集。这个"android-ndk-r23b-windows.zip"压缩包包含了NDK的第23个版本,专为Windows操作系统设计。NDK是Android应用...

    android-ndk(android-ndk-r25b-linux.zip)

    在Android应用开发中,NDK扮演着至关重要的角色,它允许开发者使用原生代码(如C和C++)来编写部分应用,以提高性能、利用硬件加速功能或复用现有的C/C++库。 1. **JNI(Java Native Interface)**: JNI是Java...

    android-ndk(android-ndk-r26b-darwin.zip)

    NDK允许开发者在Android应用中使用原生代码,以实现高性能、低级别的硬件交互以及利用已有的C/C++库。在本案例中,我们关注的是"android-ndk-r26b-darwin.zip",这是一个专为macOS系统设计的NDK版本。 **Android ...

    Android-ndk-jni AES加解密 C++

    在Android开发中,有时我们需要在原生C++代码中实现加密和解密功能,以便提高性能或利用已有的C/C++库。本知识点主要聚焦于如何在Android NDK(Native Development Kit)环境下,通过JNI(Java Native Interface)来...

    android-ndk(android-ndk-r23b-linux.zip)

    在Android应用开发中,NDK扮演着至关重要的角色,它允许开发者使用原生代码(如C和C++)来编写部分应用,以提升性能或利用特定硬件功能。 NDK的主要用途包括: 1. **性能优化**:对于计算密集型任务,如图形处理、...

    android ndk开发实例代码

    在Android开发中,JNI通常用于与NDK协同工作,使得Java应用能够利用C++库的性能优势。例如,游戏引擎、图像处理、音频和视频编码等对性能要求高的功能常采用这种方式实现。 在"HelloNdk"这个实例中,我们可能会看到...

    Android C++高级编程 使用NDK

    阅读《Android C++高级编程:使用NDK》完整版.pdf,你将全面了解并掌握在Android环境中使用C++开发的各个环节,从而能够充分利用NDK提升应用的性能和功能。对于希望深入Android原生开发的工程师来说,这是一份宝贵的...

    android-ndk(android-ndk-r26b-linux.zip)

    6. **第三方库集成**:许多开源的C/C++库可以与NDK结合使用,使得开发者可以直接在Android应用中利用这些库,比如OpenCV、FFmpeg等。 7. **C++11及更高版本支持**:随着NDK版本的更新,对C++标准的支持也在增强,...

    android-ndk(android-ndk-r25b-darwin.zip)

    Android NDK,全称为Native Development Kit,是Google提供的一款用于Android平台的C和C++库开发工具集。这个工具允许开发者在Android应用中使用原生代码,以实现高性能计算、图形处理、游戏引擎等复杂功能。`...

    Android_NDK_android端_图片处理_android_NDK_ndk开发_

    为了解决这个问题,开发者可以利用Android NDK(Native Development Kit)进行原生代码编程,通常使用C++,来实现更高效的图片处理。本文将详细介绍Android NDK在Android端图片处理中的应用以及NDK开发的相关知识点...

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

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

    Ndk-Jni开发实战

    在Android应用开发中,NDK(Native Development Kit)和JNI(Java Native Interface)是两个重要的技术,用于实现Java代码与本地C/C++代码的交互。本实战教程将深入探讨NDK-JNI的开发过程,结合具体的AES加密DEMO,...

    Android C++高级编程使用NDK [ Pro Android C++ with the NDK ]书源码

    5. **性能优化**:使用C++开发的本地代码能够更接近硬件,从而实现性能提升。但是,不当的使用可能会导致内存泄漏、崩溃等问题。因此,了解内存管理、异常处理和性能调试技巧至关重要。 6. **源码分析**:书中提供...

    Mac下的AndroidStudio的NDK配置及开发示例

    在Android应用开发中,Native Development ...通过这种方式,开发者可以利用C++的性能优势,同时利用Android Studio的便利性进行开发。在实际项目中,NDK常用于处理图形渲染、物理计算、加密解密等高性能需求的场景。

    android-ndk-r19c-linux-x86_64.zip

    总结,本文详细介绍了在Ubuntu 18.04上利用QT 5.13和Android NDK r19c构建Android原生开发环境的步骤,包括安装依赖、下载和解压NDK、配置QT Creator以及创建和运行测试项目。这将为开发者提供一个高效且稳定的开发...

    Android NDK C/C++ 简单样例

    在Android中,我们通常通过JNI来使用NDK,以便利用C或C++库提高性能,处理底层硬件操作,或者利用已有的C/C++代码库。 样例中的"TestJni"可能是一个包含C/C++源代码的目录,其中的文件可能包括: 1. `Android.mk` ...

    android-ndk-r20b-windows-x86_64.zip

    在移动开发领域,Android NDK(Native Development Kit)扮演着不可或缺的角色,它为开发者提供了在Android平台上使用C和C++编写原生代码的能力。本文将深入探讨Android NDK R20B版本,特别是其在64位Windows环境下...

    Android利用C++实现RSA-DES-AES-BASE64-MD5

    综上所述,Android利用C++实现RSA、DES、AES、BASE64和MD5涉及多个层面的知识,包括加密理论、数值计算、数据编码以及JNI接口设计。实际应用中,这些技术可以结合使用,为Android应用提供高效且安全的数据保护机制。

Global site tag (gtag.js) - Google Analytics