本页概述了 NDK 中包含的库,并提供了指向 NDK API 参考文档中相关部分的链接,以及指向这些参考文档所在指南的链接。
使用原生 API
请执行以下两个步骤,以便使用 NDK 提供的库:
通知构建系统链接到库。
如果您使用的是 ndk-build:将库添加到 Android.mk 中的 LOCAL_LDLIBS。请注意,您需要将前导 lib 替换为 -l。例如,若要链接到 libfoo 和 libbar,您需要采用:makefile
LOCAL_LDLIBS := -lfoo -lbar
如需详细了解 LOCAL_LDLIBS,请参阅 Android.mk docs 文档。
如果您使用的是 CMake:请按照 Studio 的添加 NDK API 文档中的说明操作。
使用 #include 包含代码中的相应头文件。
请注意,默认情况下,应用无法调用比其 minSdkVersion 新的 API,您必须通过 dlopen() 和 dlsym() 来使用这些 API。如需了解更简单的方法,请参阅使用较新的 API。
Core C/C++
C 库
请注意,与 Linux 不同,在 Android 上不存在单独的 libpthread 或 librt 库。该功能直接包含在 libc 中,无需显式链接。
数学函数有单独的 libm(遵循通行的 Unix 传统),但像 libc 一样,它会由构建系统自动链接。
提供
库:libc/libm/libdl
C++ 库
提供 C++17 支持。如需了解详情,请参阅 C++ 库支持。
日志记录
注意:
从 API 级别 3 开始提供。
库:liblog
参考文档:日志记录
跟踪记录
原生跟踪 API
从 API 级别 23 开始提供。
库:libandroid
指南:原生跟踪
zlib 压缩
您可以通过添加
NDK 在发布时始终包含最新的 zlib 头文件,并且 NDK 中包含的用于静态链接的 libz.a 始终是同一版本,但用于动态链接的 libz.so 则来自于设备,是在相应设备上发布的任何版本。具体来说,这意味着您构建时使用的头文件与设备上的 zlib 的版本不一致,因此针对假设实现细节的行为发出一般警告在这里尤为有效。我们不清楚公共 API 是否存在任何问题,但尤其需要注意的是,结构体布局随着时间推移发生了变化,并且未来可能会继续改变。请注意,较高 zlib 版本中的新 API 显然不适用于该 API 之前的操作系统版本。始终使用静态 libz.a(而非 libz.so)可以避免所有这些问题(代价是 APK 大小会增加)。
从 API 级别 3 开始提供(但请参阅上文的备注)。
库:libz
图形
OpenGL ES 1.0 - 3.2
标准 OpenGL ES 1.x 头文件(
如需使用 OpenGL ES 1.x,请将您的原生模块链接到 libGLESv1_CM。
如需使用 OpenGL ES 2.0,请将您的原生模块链接到 libGLESv2。
如需使用 OpenGL ES 3.x,请将您的原生模块链接到 libGLESv3。
所有基于 Android 的设备均支持 OpenGL ES 1.0 和 2.0。
只有具备所需 GPU 的 Android 设备才完全支持更高版本的 OpenGL ES,但库存在于支持引入相应库的 API 级别的所有设备上。链接到库是安全的,但应用必须查询 OpenGL ES 版本字符串和扩展字符串,以确定当前设备是否支持其需要的功能。如需了解如何执行此查询,请参阅 OpenGL 规范中的 glGetString() 说明。
此外,您必须在清单文件中放置一个
OpenGL ES 1.0 从 API 级别 4 开始提供。
OpenGL ES 2.0 从 API 级别 5 开始提供。
OpenGL ES 3.0 从 API 级别 18 开始提供。
OpenGL ES 3.1 从 API 级别 21 开始提供。
OpenGL ES 3.2 从 API 级别 24 开始提供。
EGL
EGL 通过
EGL 可让您通过原生代码执行以下操作:
列出支持的 EGL 配置。
分配和释放 OpenGL ES Surface。
创建和销毁 OpenGL ES 上下文。
切换或翻转 Surface。
API 级别 24 增加了对 EGL_KHR_mutable_render_buffer、ANDROID_create_native_client_buffer 和 ANDROID_front_buffer_auto_refresh 扩展指令集的支持。
从 API 级别 9 开始提供。
库:libEGL
指南:EGL 原生平台接口
Vulkan
Vulkan 是用于高性能三维图形渲染的低开销、跨平台 API,并且是一种由 Khronos Group 维护的开放式标准。标准
如需代码示例,请参阅 GitHub 上的 LunarG VulkanSamples 和 android-vulkan-tutorials 项目。
Vulkan 库存在于支持 API 级别 24 或更高版本的所有设备上,但应用在运行时必须检查是否具备必要的 GPU 硬件支持。不支持 Vulkan 的设备不会从 vkEnumeratePhysicalDevices 返回任何设备。
从 API 级别 24 开始提供。
库:libvulkan
指南:Vulkan Graphics API 指南
位图
libjnigraphics 库会公开允许访问 Java Bitmap 对象的像素缓冲区的 API。工作流如下:
调用 AndroidBitmap_getInfo() 以检索信息,例如指定位图句柄的宽度和高度。
调用 AndroidBitmap_lockPixels() 以锁定像素缓冲区并检索指向它的指针。这样做可确保像素在应用调用 AndroidBitmap_unlockPixels() 之前不会移动。
对像素缓冲区进行相应修改,以使其符合相应像素格式、宽度和其他特性。
调用 AndroidBitmap_unlockPixels() 以解锁缓冲区。
从 API 级别 8 开始提供。
库:libjnigraphics
参考文档:位图 API 参考文档
同步 API
自 API 级别 26 开始提供。
库:libsync
参考文档:同步 API 参考文档
相机
原生相机 API 可执行精细的照片拍摄和处理。与 Java camera2 API 不同,原生相机 API 不支持已弃用的相机 HAL 1.0 实现(即原生相机 API 中的可用相机列表不会列出达到 LEGACY 硬件级别的相机设备)。
从 API 级别 24 开始提供。
库:libcamera2ndk
参考文档:相机 API 参考文档
媒体
libmediandk
媒体 API 提供类似于 MediaExtractor、MediaCodec 和其他相关 Java API 的低层级原生接口。
库:libmediandk
参考文档:媒体 API 参考文档
OpenMAX AL
注意: 我们不再建议使用 OpenMAX AL。新代码应改用 Android Media API。
Android 原生多媒体处理基于 Khronos Group OpenMAX AL 1.0.1 API。
标准 OpenMAX AL 头文件
OpenMAX AL 的 NDK 分发还提供 Android 专用扩展指令集。如需了解这些扩展指令集,请参阅
从 API 级别 14 开始提供。
库:libOpenMAXAL
Android 原生应用 API
如需了解详情,请参阅 Android NDK API 参考文档。
API 包括:
资源
Choreographer
配置
输入
Looper
原生 Activity
原生硬件缓冲区
原生窗口
内存
网络
传感器
存储
SurfaceTexture
库:libandroid
库:libnativewindow,用于更新的原生窗口功能
完整参考文档:Android NDK API 参考文档
Binder API
借助 Binder API,您可以在进程之间创建通信渠道。这是 Android 进程间通信的低级别实现。如果可能,请优先选择更高级别的组件。不过,此库适用于高级使用场景。
库:libbinder_ndk
参考文档:Binder
硬件缓冲区 API
您可以借助两个原生 API 来针对跨进程缓冲区管理创建自己的流水线。
您可以利用原生硬件缓冲区 API (
您可以利用原生硬件缓冲区 JNI API (
音频
注意:开发者应考虑使用开源 Oboe 库,这个库可在 GitHub 上获得。Oboe 是一个 C++ 封装容器,提供与 AAudio 非常相似的 API。该封装容器在 AAudio 可用时对其进行调用,并在 AAudio 不可用时回退到 OpenSL ES。
AAudio
AAudio 是当前支持的原生音频 API。它替换了 OpenSL ES,能更好地支持需要低延迟音频的高性能音频应用。
自 API 级别 26 开始提供。
库:libaaudio
指南:AAudio API 指南
参考文档:AAudio API 参考文档
OpenSL ES
OpenSL ES 是另一个原生音频 API,它也受支持,但请参阅下面的“指南”中的说明。
从 API 级别 9 开始提供。API 级别 14 增加了 PCM 支持。
库:libOpenSLES
指南:面向 Android 的 OpenSL ES 指南
Neural Networks API
Neural Networks API (NNAPI) 为应用提供适用于设备端机器学习操作的硬件加速功能。此 API 支持在设备上创建、编译和执行模型。应用通常不会直接使用 NNAPI;相反,API 将通过机器学习库、框架和工具进行调用,以便开发者在 Android 设备上训练并部署其模型。
从 API 级别 27 开始提供。
库:libneuralnetworks
指南:神经网络指南
参考文档:Neural Networks API 参考文档