Android NDK 原生开发入门路线:从 Kotlin 到 C++、从 .so 到播放器
easyAndroidNDKJNIC++Native
如果你第一次听到 NDK,不要先把它想成“很难的 C++ 黑魔法”。先把它理解成 Android 提供的一套工具:它让 App 可以把一部分代码写成 C/C++,编译成手机 CPU 能直接执行的 native 库,然后再由 Kotlin/Java 调用。
这条路线会从零开始。我们不假设你已经懂 ABI、JNI、ELF、MediaCodec、内存页。每个术语都会先讲人话,再讲它在系统里真实发生了什么。
NDK 到底解决什么问题
Android App 默认运行在 ART 运行时里,业务代码通常写 Kotlin 或 Java。大多数场景下,这已经足够好。
NDK 适合这些场景。
已有 C/C++ 算法库要复用
视频、音频、图像处理需要更精细的性能控制
游戏引擎、渲染引擎、实时处理链路需要靠近硬件
必须调用 Android 提供的 native API
不适合这些场景。
普通页面业务
简单网络请求
数据库增删改查
只是为了“更高级”而把业务搬进 C++
NDK 像一把手术刀。它能做很精细的事,但拿它切所有东西,项目会更难维护。
一张图看懂 NDK App
Kotlin / Java 代码
|
| JNI 调用
v
C / C++ native 代码
|
| 编译
v
libxxx.so
|
| Android linker 装载
v
手机 CPU 执行机器指令
这里有四个核心词。
JNI 是 Kotlin/Java 和 C/C++ 的桥。
.so 是 shared object,共享库,Android 运行时会把它加载进进程。
ABI 决定这份 .so 能在哪类 CPU 和系统约定下运行。
linker 是负责把 .so 装进进程并解析符号的系统组件。
学习顺序
这个专题按依赖关系组织。
01 工具链与 ABI
先知道 C++ 怎样变成 .so,以及为什么同一个 App 要构建多份 native 库。
02 JNI 与运行时边界
再理解 Kotlin/Java 怎么调用 native,JNI 为什么不能随便跨线程保存引用。
03 原生内存与故障定位
学会 C++ 资源生命周期、崩溃现场、ASan/HWASan 等工具。
04 视频播放器工程实战
用 AMediaExtractor、AMediaCodec、Surface、时钟系统做一个最小播放器。
05 性能优化与硬件能力
用 simpleperf 找热点,再理解 Neon、零拷贝这些更贴近硬件的优化。
06 工程化交付
解决三方 native 库、多 ABI、符号、CI、发布前检查。
初学者最重要的心法
第一,不要把 native 当万能加速器。JNI 跨边界有成本,C++ 内存错误也更危险。
第二,不要把 .so 当普通文件。它有 ABI、符号、页对齐、依赖库、装载顺序等运行时约束。
第三,不要把播放器当 API 调用集合。播放器是并发系统,状态机、队列、时钟和生命周期比单个 API 更重要。
完成本专题后你应具备的能力
能看懂 Android Studio 如何调用 NDK 和 CMake 生成 .so
能解释 ABI、minSdk、符号可见性、16KB 页大小这些线上问题
能写出清晰的 JNI 边界,并避免 JNIEnv、LocalRef、GlobalRef 的常见坑
能定位 native crash,知道 tombstone 和 ndk-stack 看什么
能实现一个最小 NDK 视频播放器链路
能用 simpleperf、sanitizer、符号归档建立 native 工程质量闭环