本部分将讨论如何使用 NDK 提供的库。
注意:有关导入预构建库(未包含在 NDK 中的库)的指南已移至各个构建系统的相关部分。请根据您的项目需求参阅 CMake 或 ndk-build 指南。
文中说明了 NDK 提供的 C ++ 运行时,并介绍了 NDK 提供的其他库(例如 OpenGL ES 和 OpenSL ES)以及支持这些库所需的最低 Android API 级别。
本页概述了 NDK 中包含的库,并提供了指向 NDK 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 包含代码中的相应头文件。
请注意,与 Linux 不同,在 Android 上不存在单独的 libpthread 或 librt 库。该功能直接包含在 libc 中,无需显式链接。
数学函数有单独的 libm(遵循通行的 Unix 传统),但像 libc 一样,它会由构建系统自动链接。
提供
库:libc/libm/libdl
提供 C++17 支持。如需了解详情,请参阅 C++ 库支持。
注意:
从 API 级别 3 开始提供。
库:liblog
参考文档:日志记录
原生跟踪 API
从 API 级别 23 开始提供。
库:libandroid
指南:原生跟踪
您可以通过添加
从 API 级别 3 开始提供。
库:libz
标准 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 版本。
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 配置。
分配和释放 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 是用于高性能三维图形渲染的低开销、跨平台 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 级别 26 开始提供。
库:libsync
参考文档:同步 API 参考文档
原生相机 API 可执行精细的照片拍摄和处理。与 Java camera2 API 不同,原生相机 API 不支持已弃用的相机 HAL 1.0 实现(即原生相机 API 中的可用相机列表不会列出达到 LEGACY 硬件级别的相机设备)。
从 API 级别 24 开始提供。
库:libcamera2ndk
参考文档:相机 API 参考文档
媒体 API 提供类似于 MediaExtractor、MediaCodec 和其他相关 Java API 的低层级原生接口。
库:libmediandk
参考文档:媒体 API 参考文档
Android 原生多媒体处理基于 Khronos Group OpenMAX AL 1.0.1 API。
标准 OpenMAX AL 头文件
OpenMAX AL 的 NDK 分发还提供 Android 专用扩展指令集。如需了解这些扩展指令集,请参阅
从 API 级别 14 开始提供。
库:libOpenMAXAL
如需了解详情,请参阅 Android NDK API 参考文档。
API 包括:
资源
Choreographer
配置
输入
Looper
原生 Activity
原生硬件缓冲区
原生窗口
内存
网络
传感器
存储
SurfaceTexture
库:libandroid
库:libnativewindow,用于更新的原生窗口功能
完整参考文档:Android NDK API 参考文档
您可以借助两个原生 API 来针对跨进程缓冲区管理创建自己的流水线。
您可以利用原生硬件缓冲区 API (
您可以利用原生硬件缓冲区 JNI API (
注意:开发者应考虑使用开源 Oboe 库,这个库可在 GitHub 上获得。Oboe 是一个 C++ 封装容器,提供与 AAudio 非常相似的 API。该封装容器在 AAudio 可用时对其进行调用,并在 AAudio 不可用时回退到 OpenSL ES。
AAudio 是当前支持的原生音频 API。它替换了 OpenSL ES,能更好地支持需要低延迟音频的高性能音频应用。
自 API 级别 26 开始提供。
库:libaaudio
指南:AAudio API 指南
参考文档:AAudio API 参考文档
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 参考文档