教学课件(PPT) 本书源码??????    基 础 篇 第1章 NDK入门基础( 60min) 3 1.1 NDK的概念 3 1.1.1 JNI的基础概念 3 1.1.2 NDK的使用场景 4 1.1.3 NDK的学习方法 4 1.1.4 开发资料 5 1.2 编译概念 5 1.2.1 动态库 5 1.2.2 静态库 18 1.2.3 静态库和动态库的使用场景 21 1.2.4 交叉编译 21 1.2.5 预编译库 22 1.2.6 预编译库和源码编译库的区别 23 1.3 CPU指令集和ABI 24 1.3.1 CPU指令集 25 1.3.2 ABI 25 1.4 CMake概念 27 1.4.1 CMake介绍 27 1.4.2 选择CMake的原因 28 1.5 NDK目录介绍 29 1.6 本章小结 31 第2章 环境搭建( 41min) 32 2.1 Ubuntu环境搭建 32 2.1.1 Ubuntu虚拟机安装 32 2.1.2 独立NDK环境配置 48 2.2 集成NDK环境搭建之Android Studio 52 2.3 本章小结 56 第3章 NDK开发场景( 57min) 57 3.1 NDK开发实际集成源码的场景 57 3.1.1 使用Android Studio源码直接集成 57 3.1.2 使用命令编译出符合平台相关的预编译库 65 3.1.3 使用Android Studio 直接集成预编译库 70 3.1.4 使用开源代码原始的方式交叉编译FFmpeg 77 3.1.5 Neon 86 3.2 本章小结 88 第4章 CMake开发基础( 72min) 89 4.1 CMake的基础使用 89 4.1.1 日志打印方法 89 4.1.2 流程控制 90 4.1.3 目标生成与链接 95 4.1.4 CMake设置库的输出路径 96 4.1.5 CMake如何包含头文件 97 4.1.6 CMake如何包含源文件列表及包含所有源文件语法 98 4.2 CMake多模块场景 99 4.2.1 多CMake应用场景 99 4.2.2 多CMake的实际使用案例 100 4.3 本章小结 104 第5章 NDK开发常用的数据类型及使用方法( 67min) 105 5.1 基础类型说明 105 5.2 引用类型说明 106 5.2.1 C语言下的引用类型 106 5.2.2 C++语言下的引用类型 107 5.3 UTF-8和UTF-16字符串 108 5.4 常用数据类型操作函数的使用 109 5.4.1 String字符串的使用 109 5.4.2 数组操作 111 5.5 本章小结 116 第6章 NDK开发核心知识点( 51min) 117 6.1 JavaVM 117 6.2 JNIEnv 119 6.3 全局引用和局部引用 120 6.3.1 局部引用 120 6.3.2 全局引用 122 6.3.3 弱全局引用 124 6.3.4 JNI_OnLoad 126 6.3.5 JNI_OnUnload 127 第7章 NDK开发关键函数( 163min) 128 7.1 函数操作基础 128 7.1.1 函数签名 128 7.1.2 jclass 133 7.1.3 jmethodID 135 7.2 调用Java端的函数 136 7.2.1 Native调用Java端成员函数 137 7.2.2 Native调用Java端的静态函数 140 7.3 Linux线程使用方法 141 7.3.1 线程的创建函数pthread_create 141 7.3.2 获取线程ID函数pthread_self 142 7.3.3 线程退出函数pthread_exit 143 7.3.4 线程资源回收函数pthread_join 147 7.3.5 线程终止函数pthread_cancel 149 7.3.6 线程分离函数pthread_detach 153 7.3.7 线程属性pthread_attr_t 155 7.3.8 小结 158 7.4 原生线程中获取JNIEnv 158 7.5 本章小结 162 第8章 NDK开发函数注册方式( 32min) 163 8.1 函数的静态注册方式 163 8.2 函数的动态注册方式 164 8.2.1 JNINativeMethod 164 8.2.2 RegisterNatives和UnregisterNatives函数 165 8.2.3 示例 165 8.3 静态注册和动态注册的优缺点及使用场景 167 8.3.1 静态注册的优缺点及使用场景 167 8.3.2 动态注册的优缺点和使用场景 168 8.3.3 小结 168 8.4 本章小结 168 实 战 篇 第9章 NDK开发之大量数据传输( 79min) 171 9.1 DirectByteBuffer简单介绍 171 9.2 DirectByteBuffer的使用方法 172 9.2.1 创建DirectByteBuffer 172 9.2.2 DirectByteBuffer API使用 172 9.3 DirectByteBuffer的使用场景 177 9.3.1 大数据量的IO密集型操作 177 9.3.2 长期使用的数据 177 9.3.3 对内存管理有特殊要求的场景 177 9.3.4 需要直接访问操作系统内存资源的场景 177 9.4 DirectByteBuffer的使用案例 177 第10章 NDK开发之opus开源库开发案例( 70min) 181 10.1 开源库opus源码封装 182 10.1.1 opus预编译库的编译与集成 183 10.1.2 opus库的基本使用 187 10.1.3 opus库的封装 190 10.2 使用opus开发PTT语音通话案例 192 10.2.1 UI开发 192 10.2.2 编解码及网络接口封装 198 10.2.3 录音功能实现 207 10.2.4 播放功能实现 210 10.3 本章小结 212 第11章 NDK开发调试( 80min) 213 11.1 使用Android Studio调试Native代码 213 11.1.1 启用调试功能 213 11.1.2 开始调试 214 11.2 问题跟踪 225 11.2.1 Native函数返回值崩溃 225 11.2.2 动态库Debug版本和Release版本的区别 226 11.2.3 如何快速定位Native崩溃 227 11.3 本章小结 231 第12章 线上崩溃Log捕获( 31min) 232 12.1 使用谷歌开源库捕获崩溃信息 232 12.1.1 转储文件 232 12.1.2 平台支持 233 12.1.3 工作过程 233 12.1.4 Breakpad封装 233 12.2 线上崩溃信息捕获的注意事项 243 第13章 NDK开发推荐做法( 14min) 245 13.1 数据传递 245 13.1.1 减少跨层传递次数 245 13.1.2 减少数据转换 245 13.1.3 设计高效接口 246 13.1.4 综合考虑性能和资源管理 246 13.1.5 尽量避免跨层异步通信 246 13.2 JNI线程使用时的注意事项 246 13.3 JNI接口开发建议 246 13.4 动态库瘦身 247 参考文献 248    VI VII