使用原生 API

使用原生 API

本页概述了 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 库

等标准 C11 库头文件照常提供。

请注意,与 Linux 不同,在 Android 上不存在单独的 libpthread 或 librt 库。该功能直接包含在 libc 中,无需显式链接。

数学函数有单独的 libm(遵循通行的 Unix 传统),但像 libc 一样,它会由构建系统自动链接。

提供 中的 dlopen(3) 和 dlsym(3) 等动态链接器功能,但您必须显式链接到 libdl。

库:libc/libm/libdl

C++ 库

提供 C++17 支持。如需了解详情,请参阅 C++ 库支持。

日志记录

包含用于记录到 logcat 的 API。

注意: 仅提供日志记录基元。如需更多可用 API 的示例,请参阅 Android 的 log/log.h 和 android-base/logging.h。

从 API 级别 3 开始提供。

库:liblog

参考文档:日志记录

跟踪记录

原生跟踪 API 可提供相当于 Java 编程语言中 android.os.Trace 类的原生类。此 API 通过将跟踪事件写入系统跟踪缓冲区,让您能够跟踪代码中的指定工作单元。接下来,您便可以使用 Systrace 工具来收集和分析跟踪事件。

从 API 级别 23 开始提供。

库:libandroid

指南:原生跟踪

zlib 压缩

您可以通过添加 并链接到 libz 来使用 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 头文件()、2.0 头文件()、3.0 头文件()、3.1 头文件()和 3.2 头文件()包含 OpenGL ES 所必需的声明。

如需使用 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 通过 头文件提供原生平台接口,用于分配和管理 OpenGL ES 上下文和 Surface。

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 维护的开放式标准。标准 头文件包含从代码执行 Vulkan 渲染调用所需的声明。

如需代码示例,请参阅 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 头文件 包含从 Android 原生端执行多媒体输出所需的声明。

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 () 直接分配缓冲区,以针对跨进程缓冲区管理创建自己的流水线。您可以分配 AHardwareBuffer,并将其用于通过 eglGetNativeClientBufferANDROID 扩展指令集获取 EGLClientBuffer 资源类型。您可以将该缓冲区传递到 eglCreateImageKHR,以创建 EGLImage 资源类型,随后此资源类型可能会在支持的设备上通过 glEGLImageTargetTexture2DOES 与纹理绑定。此方法可用于创建可跨进程共享的纹理。

您可以利用原生硬件缓冲区 JNI API () 获取一个 HardwareBuffer 对象(这是一个 Parcelable 对象),以便在两个不同进程之间传输。如此,您的应用可获得与 SurfaceFlinger 相似的功能;例如,在不同进程之间创建自己的缓冲区队列,而无需访问内部 Android 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 参考文档

相关推荐