原生 API

此页面概述了 NDK 中包含的库,并提供了指向 NDK API 参考的相关部分以及现有指南的链接。

使用原生 API

使用 NDK 提供的库分两个步骤进行

  1. 告诉构建系统链接到库。

    • 如果您使用的是 ndk-build:将库添加到 LOCAL_LDLIBS 中的 Android.mk。请注意,您需要删除开头的 lib 并改为使用 -l。例如,要链接到 libfoolibbar,您可以编写:makefile LOCAL_LDLIBS := -lfoo -lbar

      有关 LOCAL_LDLIBS 的更多信息,请参阅 Android.mk 文档

    • 如果您使用的是 CMake:请按照 Studio 的 添加 NDK API 文档中的说明进行操作。

  2. #include 您代码中相应的标头。

请注意,比您的应用的 minSdkVersion 新的 API 默认情况下不可调用,您必须通过 dlopen()dlsym() 使用它们。有关更简单的方法,请参阅 使用较新的 API

核心 C/C++

C 库

标准 C11 库标头(如 <stdlib.h><stdio.h>)照常可用。

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

有一个单独的 libm 用于数学函数(遵循通常的 Unix 传统),但与 libc 一样,构建系统会自动链接它。

<dlfcn.h> 中的动态链接器功能(如 dlopen(3) 和 dlsym(3))可用,但您必须显式链接到 libdl

库:libc / libm / libdl

C++ 库

提供 C++17 支持。有关 C++ 库支持的更多信息,请参阅 C++ 库支持

日志记录

<android/log.h> 包含用于将日志记录到 logcat 的 API。

自 API 级别 3 起可用。

库:liblog

参考:日志记录

跟踪

原生跟踪 API <android/trace.h> 提供了 Java 编程语言中 android.os.Trace 类的原生等效项。此 API 允许您通过将跟踪事件写入系统跟踪缓冲区来跟踪代码中命名的工作单元。然后,您可以使用 Systrace 工具 收集和分析跟踪事件。

自 API 级别 23 起可用。

库:libandroid

指南:原生跟踪

zlib 压缩

您可以通过包含 <zlib.h> 并链接到 libz 来使用 Zlib 压缩库

NDK 始终包含发布时的最新 zlib 头文件,并且 NDK 中包含的用于静态链接的 libz.a 始终是同一版本,但用于动态链接的 libz.so 来自设备,并且可能是该设备上发布的任何版本。特别是,这意味着您构建的 header 文件与设备上的 zlib 版本不匹配,因此通常关于对实现细节进行假设的警告在这里尤其有效。我们没有发现任何关于公共 API 的问题,但结构布局尤其随着时间的推移而发生了变化,并且可能会继续发生变化。请注意,在以后的 zlib 版本中的新 API 显然在早于 API 的 OS 版本上不可用。可以通过始终使用静态 libz.a 而不是 libz.so 来避免所有这些问题(以增加 APK 大小为代价)。

自 API 级别 3 起可用(但请参见上文说明)。

库:libz

图形

OpenGL ES 1.0 - 3.2

标准的 OpenGL ES 1.x header 文件(<GLES/gl.h><GLES/glext.h>)、2.0 header 文件(<GLES2/gl2.h><GLES2/gl2ext.h>)、3.0 header 文件(<GLES3/gl3.h><GLES3/gl3ext.h>)、3.1 header 文件(<GLES3/gl31.h><GLES3/gl3ext.h>)以及 3.2 header 文件(<GLES3/gl32.h><GLES3/gl3ext.h>)包含 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() 的描述。

此外,您必须在清单文件中放置一个 <uses-feature> 标记以指示您所需的 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/egl.h><EGL/eglext.h> header 文件提供原生平台接口,用于分配和管理 OpenGL ES 上下文和 surface。

EGL 允许您从原生代码执行以下操作

  • 列出受支持的 EGL 配置。
  • 分配和释放 OpenGL ES surface。
  • 创建和销毁 OpenGL ES 上下文。
  • 交换或翻转 surface。

API 级别 24 添加了对 EGL_KHR_mutable_render_bufferANDROID_create_native_client_bufferANDROID_front_buffer_auto_refresh 扩展的支持。

自 API 级别 9 起可用。

库:libEGL

指南:EGL 原生平台接口

Vulkan

Vulkan 是一种用于高性能 3D 图形渲染的低开销、跨平台 API。Vulkan 是由 Khronos Group 维护的 开放标准。标准的 <vulkan/vulkan.h> header 文件包含从您的代码执行 Vulkan 渲染调用所需的声明。

有关代码示例,请参阅 GitHub 上的 LunarG VulkanSamplesandroid-vulkan-tutorials 项目。

Vulkan 库存在于所有支持 API 级别 24 或更高版本的设备上,但应用必须在运行时检查必要的 GPU 硬件支持是否可用。不支持 Vulkan 的设备将从 vkEnumeratePhysicalDevices 返回零个设备。

自 API 级别 24 起可用。

库:libvulkan

指南:Vulkan 图形 API 指南

位图

libjnigraphics 库公开了允许访问 Java Bitmap 对象的像素缓冲区的 API。工作流程如下

  1. 调用 AndroidBitmap_getInfo() 以检索有关给定位图句柄的信息,例如宽度和高度。

  2. 调用 AndroidBitmap_lockPixels() 以锁定像素缓冲区并检索指向它的指针。这样做可以确保像素在应用调用 AndroidBitmap_unlockPixels() 之前不会移动。

  3. 根据其像素格式、宽度和其他特性适当地修改像素缓冲区。

  4. 调用 AndroidBitmap_unlockPixels() 以解锁缓冲区。

自 API 级别 8 起可用。

库:libjnigraphics

参考:位图 API 参考

Sync API

自 API 级别 26 起可用。

库:libsync

参考:Sync API 参考

相机

原生相机 API 执行细粒度的照片捕获和处理。与 Java camera2 API 不同,原生相机 API 不支持已弃用的相机 HAL 1.0 实现(即,原生相机 API 中可用的相机列表不会列出具有 LEGACY 硬件级别的相机设备)。

自 API 级别 24 起可用。

库:libcamera2ndk

参考:相机 API 参考

媒体

libmediandk

媒体 API 提供类似于 MediaExtractorMediaCodec 和其他相关 Java API 的低级原生接口。

库:libmediandk

参考:媒体 API 参考

OpenMAX AL

Android 原生多媒体处理基于 Khronos Group OpenMAX AL 1.0.1 API。

标准的 OpenMAX AL header 文件 <OMXAL/OpenMAXAL.h><OMXAL/OpenMAXAL_Platform.h> 包含从 Android 的原生端执行多媒体输出所需的声明。

OpenMAX AL 的 NDK 发行版还提供 Android 特定的扩展。有关这些扩展的信息,请参阅 <OMXAL/OpenMAXAL_Android.h> 中的注释。

自 API 级别 14 起可用。

库:libOpenMAXAL

Android 原生应用程序 API

有关更多信息,请参阅 Android NDK API 参考 文档。

API 包括

库:libandroid

库:libnativewindow(用于更新的原生窗口功能)

完整参考:Android NDK API 参考

硬件缓冲区 API

有两个原生 API 允许您创建自己的跨进程缓冲区管理管道。

原生硬件缓冲区 API <android/hardware_buffer.h> 允许您直接分配缓冲区以创建自己的跨进程缓冲区管理管道。您可以分配一个 AHardwareBuffer 并使用它通过 eglGetNativeClientBufferANDROID 扩展获取 EGLClientBuffer 资源类型。您可以将该缓冲区传递给 eglCreateImageKHR 以创建 EGLImage 资源类型,然后可以通过受支持设备上的 glEGLImageTargetTexture2DOES 将其绑定到纹理。这对于创建可在跨进程共享的纹理很有用。

原生硬件缓冲区 JNI API(<android/hardware_buffer_jni.h>)允许您获取 HardwareBuffer 对象,它是一个 Parcelable,因此可以在两个不同的进程之间传输。这使您的应用具备类似于 SurfaceFlinger 的功能,例如在不访问内部 Android API 的情况下创建进程之间的缓冲区队列。

音频

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 指南

神经网络 API

神经网络 API (NNAPI) 为应用提供了用于设备上机器学习操作的硬件加速。该 API 支持设备上模型的创建、编译和执行。应用通常不直接使用 NNAPI;相反,该 API 旨在由机器学习库、框架和工具调用,这些库、框架和工具允许开发者训练其模型并在 Android 设备上部署它们。

自 API 级别 27 起可用。

库:libneuralnetworks

指南:神经网络指南

参考:神经网络 API 参考