原生 API

本頁面概略介紹 NDK 內含的程式庫,並提供 NDK API 參考資料相關內容的連結,以及這些參考資料所在指南的連結。

使用原生 API

請執行以下兩個步驟,以便使用 NDK 提供的程式庫:

  1. 指示建構系統連結至程式庫。

    • 如果使用的是 ndk-build,請將程式庫新增至 Android.mk 中的 LOCAL_LDLIBS。 請注意,您必須移除開頭的 lib,並改為 -l。 例如,如要連結至 libfoolibbar,您需要寫入 makefile LOCAL_LDLIBS := -lfoo -lbar

      如要進一步瞭解 LOCAL_LDLIBS,請參閱 Android.mk 說明文件。

    • 如果使用的是 CMake,請按照 Studio 的新增 NDK API 說明文件中的指示操作。

  2. 使用 #include 納入適當的程式碼標頭。

Core C/C++

C 程式庫

<stdlib.h><stdio.h> 等標準 C11 程式庫標頭會照常提供。

請注意,不同於 Linux,Android 中沒有單獨的 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 壓縮程式庫

從 API 級別 3 開始提供。

程式庫:libz

圖形

OpenGL ES 1.0 - 3.2

標準 OpenGL ES 1.x 標頭 (<GLES/gl.h><GLES/glext.h>)、2.0 標頭 (<GLES2/gl2.h><GLES2/gl2ext.h>)、3.0 標頭 (<GLES3/gl3.h><GLES3/gl3ext.h>)、3.1 標頭 (<GLES3/gl31.h><GLES3/gl3ext.h>),以及 3.2 標頭 (<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> 標頭提供原生平台介面,用於配置及管理 OpenGL ES 情境和介面。

EGL 可讓您透過原生程式碼執行以下作業:

  • 列出支援的 EGL 設定。
  • 配置及釋出 OpenGL ES 介面。
  • 建立及刪除 OpenGL ES 情境。
  • 切換或翻轉介面。

API 級別 24 增加 EGL_KHR_mutable_render_bufferANDROID_create_native_client_bufferANDROID_front_buffer_auto_refresh 擴充功能支援。

從 API 級別 9 開始提供。

程式庫:libEGL

指南:EGL 原生平台介面

Vulkan

Vulkan 是一款用於高效能 3D 圖形算繪的低成本跨平台 API,也是由 Khronos Group 維護的開放式標準。標準 <vulkan/vulkan.h> 標頭檔案包含從程式碼執行 Vulkan 算繪呼叫所需的宣告。

如需程式碼範例,請參閱 GitHub 上的 LunarG VulkanSamplesandroid-vulkan-tutorials 專案。

凡是支援 API 級別 24 或以上級別的裝置,皆有 Vulkan 程式庫,但應用程式必須在執行階段檢查是否具有所需的 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 參考資料

同步 API

從 API 級別 26 開始提供。

程式庫:libsync

參考資料:同步 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 標頭 <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,並將其用於取得 EGLClientBuffer 資源類型 (透過 eglGetNativeClientBufferANDROID 擴充功能取得)。您可以將這個緩衝區傳遞至 eglCreateImageKHR,以便建立 EGLImage 資源類型,接著,該資源類型可能會在支援的裝置上透過 glEGLImageTargetTexture2DOES 與紋理繫結。如要建立可以跨程序共用的紋理,這個方法便很適合。

您可以透過原生硬體緩衝區 JNI API (<android/hardware_buffer_jni.h>) 取得 HardwareBuffer 物件,此物件為 Parcelable 物件,可以在兩個不同程序之間傳輸。這讓應用程式可以使用與 SurfaceFlinger 類似的功能,例如在不同程序之間建立緩衝區佇列,而無需存取內部 Android API。

音訊

AAudio

AAudio 是目前支援的原生音訊 API。AAudio 取代了 OpenSL ES,可為需要低延遲音訊的高效能音訊應用程式提供更優質的支援。

從 API 級別 26 開始提供。

程式庫:libaaudio

指南:AAudio API 指南

參考資料:AAudio API 參考資料

OpenSL ES

OpenSL ES 是另一個原生音訊 API,NDK 也支援此 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 指南

參考資料:Neural Networks API 參考資料