编辑推荐
《移动开发经典丛书:Android C++高级编程:使用NDK》提供了移植、开发以及利用Android平台上的C++和其他原生代码所需要的知识和技能,以便于运行图形化的高级应用和更复杂的原生应用。
内容简介
Android是移动电话市场的主要角色而且其市场份额正在持续增长。它是一个完整的、开放的、免费的移动平台,该平台给移动应用开发者提供了无限的机会。
虽然Android平台的官方程序语言是Java,但应用开发者不限于仅使用Java技术。
Android允许应用开发者通过Android原生开发包(NDK)使用诸如C和C++之类的原生代码语言实现他们的部分应用。《移动开发经典丛书·Android C++高级编程:使用NDK》中我们将学习如何用AndroidNDK通过原生代码语言去实现自己的Android应用中对性能要求较高的部分。
《移动开发经典丛书·Android C++高级编程:使用NDK》介绍了原生应用开发、可用的原生API以及故障排除技术的详细叙述,包括用按步骤的指导和屏幕截图以帮助Android开发人员迅速达到开发原生应用的目的。
主要内容:
在主要的操作系统上安装Android原生开发环境。
使用Eclipse集成开发环境开发原生代码。
使用Java原生接口(JNI)将原生代码与Java代码连接。
用SWIG自动生成JNI代码。
用POSIX和Java线程开发多线程原生应用。
用POSIXsockets开发网络原生应用。
用logging、GDB和Eclipse调试器调试原生代码。
用Valgrind分析内存问题。
用GProf测试应用性能。
用SIMD/NEON优化原生代码。
作者简介
Onur Cinar,有超过17年的移动和通信领域大规模复杂软件项目的设计、开发和管理经验。他的专业技能包括VoIP、视频通信、移动应用程序、网格计算和不同平台上的网络技术。从Android平台问世他就一直积极从事这方面的工作。他是Apress出版的Android Apps with Eclipse一书的作者。他在美国宾州费城Drexel大学获得计算机科学理学学士学位。现就职于微软Skype分部,任Android平台的Skype客户端高级产品工程经理。
内页插图
目录
第1章 Android平台上的C++入门
1.1 Microsoft Windows
1.1.1 在Windows平台上下载并安装JDK开发包
1.1.2 在Windows平台上下载并安装ApacheANT
1.1.3 在Windows平台上下载并安装AndroidSDK
1.1.4 在Windows平台上下载并安装Cygwin
1.1.5 在Windows平台上下载并安装AndroidNDK
1.1.6 在Windows平台上下载并安装Eclipse
1.2 AppleMacOSX
1.2.1 在Mac平台上安装Xcode
1.2.2 验证Mac平台的Java开发包
1.2.3 验证Mac平台上的ApacheANT
1.2.4 验证GNUMake
1.2.5 在Mac平台上下载并安装AndroidSDK
1.2.6 在Mac平台上下载并安装AndroidNDK
1.2.7 在Mac平台上下载并安装Eclipse
1.3 UbuntuLinux
1.3.1 检查GNUC库版本
1.3.2 激活在64位系统上支持32位的功能
1.3.3 在Linux平台上下载并安装Java开发工具包(JDK)
1.3.4 在Linux平台上下载并安装ApacheANT
1.3.5 在Linux平台上下载并安装GNUMake
1.3.6 在Linux平台上下载并安装AndroidSDK
1.3.7 在Linux平台上下载并安装AndroidNDK
1.3.8 在Linux平台上下载并安装Eclipse
1.4 下载并安装ADT
1.4.1 安装Android平台包
1.4.2 配置模拟器
1.5 小结
第2章 深入了解AndroidNDK
2.1 AndroidNDK提供的组件
2.2 AndroidNDK的结构
2.3 以一个示例开始
2.3.1 指定AndroidNDK的位置
2.3.2 导入示例项目
2.3.3 向项目中添加原生支持
2.3.4 运行项目
2.3.5 用命令行对项目进行构建
2.3.6 检测AndroidNDK项目的结构
2.4 构建系统
2.4.1 Android.mk
2.4.2 Application.mk
2.5 使用NDK-Build脚本
2.6 排除构建系统故障
2.7 小结
第3章 用JNI实现与原生代码通信
3.1 什么是JNI
3.2 以一个示例开始
3.2.1 原生方法的声明
3.2.2 加载共享库
3.2.3 实现原生方法
3.3 数据类型
3.3.1 基本数据类型
3.3.2 引用类型
3.4 对引用数据类型的操作
3.4.1 字符串操作
3.4.2 数组操作
3.4.3 NIO操作
3.4.4 访问域
3.4.5 调用方法
3.4.6 域和方法描述符
3.5 异常处理
3.5.1 捕获异常
3.5.2 抛出异常
3.6 局部和全局引用
3.6.1 局部引用
3.6.2 全局引用
3.6.3 弱全局引用
3.7 线程
3.7.1 同步
3.7.2 原生线程
3.8 小结
第4章 使用SWIG自动生成JNI代码
4.1 什么是SWIG
4.2 安装
4.2.1 Windows平台上SWIG的安装
4.2.2 在MacOSX下安装
4.2.3 在UbuntuLinux下安装
4.3 通过示例程序试用SWIG
4.3.1 接口文件
4.3.2 在命令行方式下调用SWIG
4.3.3 将SWIG集成到Android构建过程中
4.3.4 更新Activity.
4.3.5 执行应用程序
4.3.6 剖析生成的代码
4.4 封装C语言代码
4.4.1 全局变量
4.4.2 常量
4.4.3 只读变量
4.4.4 枚举
4.4.5 结构体
4.4.6 指针
4.5 封装C++代码
4.5.1 指针、引用和值
4.5.2 默认参数
4.5.3 重载函数
4.5.4 类
4.6 异常处理
4.7 内存管理
4.8 从原生代码中调用Java
4.8.1 异步通信
4.8.2 启用Directors
4.8.3 启用RTTI
4.8.4 重写回调方法
4.8.5 更新HeIIojniActivity
4.9 小结
第5章 日志、调试及故障处理
5.1 日志
5.1.1 框架
5.1.2 原生日志API
5.1.3 受控制的日志
5.1.4 控制台日志
5.2 调试
5.2.1 预备知识
5.2.2 调试会话建立
5.2.3 建立调试示例
……
第6章 BionicAPI入门
第7章 原生线程
第8章 POSIXSocketAPI:面向连接的通信
第9章 POSIXSocketAPI:无连接的通信
第10章 POSIXSocketAPI:本地通信
第11章 支持C++
第12章 原生图形API
第13章 原生音频API
第14章 程序概要分析和NEON优化
前言/序言
洞悉Android原生开发前沿:精研NDK,解锁移动应用极致性能 在这智能手机已成为生活核心的时代,移动应用的体验,尤其是性能,早已成为用户选择和留存的关键。从流畅的UI交互到复杂的图形渲染,再到实时音视频处理、大规模数据运算,高效的底层实现能力是衡量一款应用是否卓越的重要标尺。而Android原生开发,特别是利用Android NDK(Native Development Kit),正是实现这一目标的不二法门。 本书并非泛泛而谈的Android基础教程,而是直击核心,专注于Android C++高级编程。它以一个极为明确且深入的视角,带领读者踏上一段探寻Android平台下C++开发精髓的旅程。这本书是献给那些不满足于Dalvik/ART虚拟机性能上限,渴望触及硬件底层,追求极致性能与效率的Android开发者。如果你已经具备一定的Java/Kotlin开发基础,并希望在性能敏感的场景下,能够拥有更强大的掌控力,那么这本书将是你迈向Android原生开发高级领域的绝佳起点。 为何选择NDK?性能的终极追求与跨平台可能 随着移动互联网的飞速发展,应用的复杂度与日俱增,许多原生Android应用中的计算密集型任务,如游戏引擎、图像/视频处理、机器学习模型推理、物理模拟、加密解密等,如果仅仅依赖Java/Kotlin,其性能表现往往会受到虚拟机指令集和垃圾回收机制的制约。此时,NDK便应运而生,它允许开发者直接使用C/C++语言编写高性能的代码,并将其集成到Android应用中。 通过NDK,你可以: 最大化性能: C/C++代码可以编译成ARM、x86等原生指令集,直接在CPU上运行,避免了Java/Kotlin虚拟机带来的性能损耗,尤其在CPU密集型计算方面,性能提升往往是指数级的。 复用现有C/C++库: 如果你的团队或项目已经积累了大量的C/C++库,NDK可以让你无缝地将这些成熟、高效的代码集成到Android应用中,节省开发时间和成本。 实现跨平台开发: NDK为移动平台带来了C/C++的强大能力,这使得开发者能够更容易地在Android、iOS甚至桌面平台之间共享部分核心业务逻辑,构建真正的跨平台解决方案。 访问更底层的系统API: NDK提供了一些接口,允许你直接调用Android原生系统的API,这在进行一些系统级的功能开发时尤为重要。 本书将深入剖析NDK的工作原理,从最基础的JNI(Java Native Interface)交互机制,到如何有效地组织和管理原生代码,再到如何进行性能调优,层层递进,让你充分理解NDK的强大之处。 书中的核心内容概览: 本书的设计思路是以实践为导向,理论与实践相结合,确保读者不仅能理解概念,更能掌握动手实践的能力。 JNI的深度解析与高级技巧: JNI是Java/Kotlin与C/C++之间通信的桥梁,本书不会停留在简单的函数调用,而是会深入探讨JNI的内存管理、数据类型转换、对象传递、异常处理、多线程安全等关键细节。你将学习如何设计高效的JNI接口,如何避免常见的JNI陷阱,以及如何优化JNI调用的开销。这部分内容是掌握NDK开发的基础,也是决定原生代码性能的关键。 C/C++代码在Android上的编译与构建: 理解Android的构建系统(Gradle)如何与NDK协同工作至关重要。本书将详细介绍CMake和ndk-build这两种常用的构建工具的使用方法,包括如何配置构建脚本、管理依赖、设置编译选项、生成不同架构的ABI(Application Binary Interface)库等。你将学习如何构建复杂的原生项目,如何集成第三方C/C++库,并掌握跨平台构建的策略。 性能优化与内存管理: 原生代码的性能优势固然巨大,但如果不善加利用,也可能导致内存泄漏或性能瓶颈。本书将提供一套系统的性能分析和优化方法论,包括如何使用Android Studio内置的性能分析工具(如Profiler)来检测CPU使用率、内存占用等,如何进行代码级的优化,以及如何有效地管理原生内存,防止内存泄漏,确保应用的稳定性和高效性。 图形与多媒体: Android平台在图形渲染和多媒体处理方面拥有强大的原生API。本书将引导你探索如何利用OpenGL ES进行高性能的2D/3D图形渲染,构建流畅炫酷的游戏画面或可视化效果。同时,你还将学习如何使用Android的媒体框架(如MediaCodec, MediaMuxer)来处理音视频编解码、录制、播放等复杂任务,实现高性能的多媒体应用。 跨平台库的集成与应用: 现代移动开发往往需要集成各种成熟的跨平台库,如用于图像处理的OpenCV,用于机器学习的TensorFlow Lite,用于网络通信的Boost.Asio或libcurl等。本书将详细介绍如何将这些第三方C/C++库集成到Android项目中,并与Java/Kotlin代码进行有效的交互。你将学习到库的构建、依赖管理、ABI适配等关键技术,从而快速构建功能强大的应用。 线程与并发: 在原生代码中进行多线程编程需要更精细化的控制。本书将深入探讨C++11/14/17标准中的并发特性,以及Android提供的Pthreads等原生线程API。你将学习如何设计线程安全的结构,如何处理共享资源的同步问题,如何避免死锁和竞态条件,以及如何利用多核CPU的优势来提升应用性能。 异常处理与调试: 原生代码的调试比Java/Kotlin更具挑战性。本书将介绍如何在Android Studio中进行C/C++代码的调试,包括设置断点、查看变量、分析堆栈信息等。同时,也将涵盖原生代码的异常处理机制,如何捕获和处理C++异常,以及如何将原生异常传递给Java/Kotlin层,确保应用的健壮性。 高级主题与未来展望: 除了核心技术,本书还会涉及一些更高级的主题,例如如何编写JNI库的单元测试,如何对NDK项目进行静态分析和代码审查,以及NDK在未来的发展趋势,如WebAssembly在移动端的应用潜力等。 本书的目标读者: 有一定Android基础的开发者: 熟悉Android的Java/Kotlin开发,了解Activity、Fragment、Service等核心组件,并希望在性能方面进行突破。 寻求极致性能的开发者: 正在开发对性能有极高要求的应用,如游戏、AR/VR应用、图像/视频处理工具、科学计算应用等。 希望复用C/C++代码库的开发者: 项目中存在大量现有的C/C++代码,希望将其集成到Android应用中。 对底层技术感兴趣的开发者: 希望深入理解Android平台的工作原理,探索原生代码的强大能力。 有志于跨平台开发的开发者: 希望学习如何利用C/C++在Android平台上实现跨平台功能。 阅读本书,你将收获: 掌握NDK开发,你将不再受限于虚拟机,能够以近乎原生代码的速度实现各种复杂的计算和功能。这将极大拓展你的开发视野,让你能够承接更具挑战性的项目,为用户提供更卓越、更流畅的应用体验。本书将是你成为一名资深Android原生开发工程师的宝贵阶梯,助你站在移动技术的最前沿,解锁应用的无限可能。