Questa pagina fornisce una panoramica delle librerie incluse nell'NDK, con link alle parti pertinenti della documentazione di riferimento dell'API NDK e alle guide, se esistenti.
Utilizzare le API native
Per utilizzare una libreria fornita dall'NDK sono necessari due passaggi:
Indica al sistema di build di eseguire il collegamento alla libreria.
Se utilizzi ndk-build: aggiungi la libreria a
LOCAL_LDLIBS
in Android.mk. Tieni presente che devi rimuovere illib
iniziale e dire-l
. Ad esempio, per eseguire il collegamento alibfoo
elibbar
, devi scrivere:makefile LOCAL_LDLIBS := -lfoo -lbar
Per saperne di più su
LOCAL_LDLIBS
, consulta la documentazione relativa ai file Android.mk.Se utilizzi CMake: segui le istruzioni riportate nella documentazione di Studio relativa all'aggiunta di API NDK.
#include
le intestazioni appropriate dal tuo codice.
Tieni presente che le API più recenti del minSdkVersion
della tua applicazione non saranno richiamabili per impostazione predefinita e dovrai utilizzarle tramite dlopen()
e dlsym()
.
Per un approccio più semplice, vedi Utilizzare API più recenti.
C/C++ di base
Libreria C
Gli header delle librerie C11 standard come <stdlib.h>
e <stdio.h>
sono disponibili come al solito.
Tieni presente che su Android, a differenza di Linux, non esistono librerie libpthread
o librt
separate. Questa funzionalità è inclusa direttamente in libc
,
che non deve essere collegato esplicitamente.
Esiste un libm
separato per le funzioni matematiche (secondo la consueta tradizione Unix), ma, come libc
, viene collegato automaticamente dai sistemi di compilazione.
La funzionalità del linker dinamico in <dlfcn.h>
, come dlopen(3) e dlsym(3), è disponibile, ma devi eseguire il collegamento esplicito a libdl
.
Libreria: libc
/ libm
/ libdl
Libreria C++
È disponibile il supporto di C++17. Per ulteriori informazioni sul supporto delle librerie C++, consulta Supporto delle librerie C++.
Logging
<android/log.h>
contiene le API per la registrazione in logcat.
Disponibile dal livello API 3.
Libreria: liblog
Riferimento: Logging
Traccia
L'API di monitoraggio nativa <android/trace.h>
fornisce l'equivalente nativo della
classe android.os.Trace
nel linguaggio di programmazione Java. Questa API consente di monitorare unità di lavoro denominate nel codice scrivendo eventi di traccia nel buffer di traccia di sistema. Puoi quindi raccogliere e analizzare gli eventi di traccia utilizzando
lo strumento Systrace.
Disponibile dal livello API 23.
Libreria: libandroid
Guida: Monitoraggio nativo
Compressione zlib
Puoi utilizzare la libreria di compressione Zlib
includendo <zlib.h>
e eseguendo il collegamento a libz
.
L'NDK include sempre i file di intestazione zlib più recenti al momento del rilascio,
e il libz.a
incluso nell'NDK per il collegamento statico è sempre la stessa versione, ma il libz.so
per il collegamento dinamico proviene dal dispositivo
e sarà la versione rilasciata su quel dispositivo. In particolare,
significa che le intestazioni su cui hai eseguito la compilazione non corrispondono alla versione di
zlib sul dispositivo, pertanto i consueti avvisi contro le supposizioni sui dettagli di
implementazione sono particolarmente validi in questo caso. Non siamo a conoscenza di alcun
problema con l'API pubblica, ma il layout della struttura in particolare è cambiato nel tempo
e probabilmente continuerà a farlo. Tieni presente che la nuova API nelle versioni successive di zlib
ovviamente non sarà disponibile nelle versioni del sistema operativo precedenti all'API. È possibile evitare tutti questi problemi (a costo di un aumento delle dimensioni dell'APK) utilizzando sempre libz.a
statico anziché libz.so
.
Disponibile dal livello API 3 (ma vedi la nota sopra).
Libreria: libz
Grafica
OpenGL ES 1.0 - 3.2
Gli intestazioni standard OpenGL ES 1.x (<GLES/gl.h>
e <GLES/glext.h>
),
le intestazioni 2.0 (<GLES2/gl2.h>
e <GLES2/gl2ext.h>
), le intestazioni 3.0
(<GLES3/gl3.h>
e <GLES3/gl3ext.h>
), le intestazioni 3.1 (<GLES3/gl31.h>
e <GLES3/gl3ext.h>
) e le intestazioni 3.2 (<GLES3/gl32.h>
e
<GLES3/gl3ext.h>
) contengono le dichiarazioni necessarie per OpenGL ES.
Per utilizzare OpenGL ES 1.x, collega il modulo nativo a libGLESv1_CM
.
Per utilizzare OpenGL ES 2.0, collega il modulo nativo a libGLESv2
.
Per utilizzare OpenGL ES 3.x, collega il modulo nativo a libGLESv3
.
Tutti i dispositivi basati su Android supportano OpenGL ES 1.0 e 2.0.
Solo i dispositivi Android con la GPU necessaria supportano completamente le versioni successive di OpenGL ES, ma le librerie sono presenti su tutti i dispositivi che supportano il livello dell'API in cui sono state introdotte. È possibile eseguire il collegamento alle librerie in tutta sicurezza, ma un'app deve eseguire una query sulla stringa della versione e sulla stringa di estensione di OpenGL ES per determinare se il dispositivo corrente supporta le funzionalità di cui ha bisogno. Per informazioni su come eseguire questa query, consulta la descrizione di glGetString()
nella specifica OpenGL.
Inoltre, devi inserire un
tag <uses-feature>
nel
file manifest per indicare la versione di
OpenGL ES richiesta.
OpenGL ES 1.0 è disponibile dal livello API 4.
OpenGL ES 2.0 è disponibile dal livello API 5.
OpenGL ES 3.0 è disponibile dal livello API 18.
OpenGL ES 3.1 è disponibile dal livello API 21.
OpenGL ES 3.2 è disponibile dal livello API 24.
EGL
EGL fornisce un'interfaccia della piattaforma nativa tramite gli header <EGL/egl.h>
e
<EGL/eglext.h>
per l'allocazione e la gestione di contesti e superfici OpenGL ES.
EGL ti consente di eseguire le seguenti operazioni dal codice nativo:
- Elenca le configurazioni EGL supportate.
- Alloca e rilascia le piattaforme OpenGL ES.
- Crea e distruggi i contesti OpenGL ES.
- Scambia o capovolgi le superfici.
Il livello API 24 ha aggiunto il supporto per le estensioni
EGL_KHR_mutable_render_buffer
,
ANDROID_create_native_client_buffer
,
e
ANDROID_front_buffer_auto_refresh
.
Disponibile dal livello API 9.
Libreria: libEGL
Guida: Interfaccia della piattaforma nativa EGL
Vulkan
Vulkan è un'API multipiattaforma a basso overhead per il rendering di grafica 3D ad alte prestazioni. Vulkan è uno standard aperto manutenuto dal Khronos Group. Il file di intestazione <vulkan/vulkan.h>
standard contiene le dichiarazioni necessarie per eseguire chiamate di rendering Vulkan dal codice.
Per esempi di codice, consulta i progetti LunarG VulkanSamples e android-vulkan-tutorials su GitHub.
La libreria Vulkan è presente su tutti i dispositivi che supportano il livello API 24 o versioni successive, ma le app devono verificare in fase di esecuzione che sia disponibile il supporto hardware GPU necessario. I dispositivi senza supporto Vulkan restituiranno zero dispositivi da
vkEnumeratePhysicalDevices
.
Disponibile dal livello API 24.
Libreria: libvulkan
Guida: Guida all'API grafica Vulkan
Bitmap
La libreria libjnigraphics
espone l'API che consente di accedere ai buffer di pixel
degli oggetti Bitmap
Java. Il flusso di lavoro è il seguente:
Chiama
AndroidBitmap_getInfo()
per recuperare informazioni, come larghezza e altezza, su un determinato handle bitmap.Richiama
AndroidBitmap_lockPixels()
per bloccare il buffer di pixel e recuperare un puntatore. In questo modo, i pixel non si spostano finché l'app non chiamaAndroidBitmap_unlockPixels()
.Modifica il buffer dei pixel in base al formato, alla larghezza e ad altre caratteristiche dei pixel.
Chiama
AndroidBitmap_unlockPixels()
per sbloccare il buffer.
Disponibile dal livello API 8.
Libreria: libjnigraphics
Riferimento: Riferimento all'API Bitmap
API Sync
Disponibile dal livello API 26.
Libreria: libsync
Riferimento: Riferimento all'API Sync
Fotocamera
Le API di fotocamera native eseguono l'acquisizione e l'elaborazione delle foto con granularità fine. A differenza dell'API camera2 di Java, l'API fotocamera nativa non supporta le implementazioni deprecated della HAL della fotocamera 1.0 (ovvero l'elenco delle fotocamere disponibili nell'API fotocamera nativa non elenca i dispositivi con il livello hardware LEGACY).
Disponibile dal livello API 24.
Libreria: libcamera2ndk
Riferimento: Riferimento API Camera
Contenuti multimediali
libmediandk
Le API Media forniscono interfacce native di basso livello simili a MediaExtractor
,
MediaCodec
e ad altre API Java correlate.
Libreria: libmediandk
Riferimento: Riferimento API Media
OpenMAX AL
La gestione multimediale nativa di Android si basa sull'API OpenMAX AL 1.0.1 del Khronos Group.
Gli intestazioni OpenMAX AL standard <OMXAL/OpenMAXAL.h>
e
<OMXAL/OpenMAXAL_Platform.h>
contengono le dichiarazioni necessarie per eseguire
l'output multimediale dal lato nativo di Android.
La distribuzione NDK di OpenMAX AL fornisce anche estensioni specifiche per Android.
Per informazioni su queste estensioni, consulta i commenti in
<OMXAL/OpenMAXAL_Android.h>
.
Disponibile dal livello API 14.
Libreria: libOpenMAXAL
API di applicazioni native per Android
Per saperne di più, consulta la documentazione di riferimento dell'API Android NDK.
Le API includono:
- Asset
- Coreografo
- Configurazione
- Ingresso
- Looper
- Attività nativa
- Buffer hardware nativi
- Finestra nativa
- Memoria
- Networking
- Sensore
- Spazio di archiviazione
- SurfaceTexture
Libreria: libandroid
Libreria: libnativewindow
per una funzionalità della finestra nativa più recente
Riferimento completo: Riferimento API Android NDK
API Binder
Le API Binder ti consentono di creare canali di comunicazione tra i processi. Si tratta dell'implementazione a basso livello della comunicazione interprocessuale di Android. Se possibile, preferisci i componenti di livello superiore. Tuttavia, questa libreria è disponibile per i casi d'uso avanzati.
Libreria: libbinder_ndk
Riferimento: Binder
API Hardware Buffer
Esistono due API native che ti consentono di creare le tue pipeline per la gestione dei buffer tra processi.
L'API buffer hardware nativa
<android/hardware_buffer.h>
ti consente di allocare direttamente i buffer per creare le tue pipeline per la gestione dei buffer tra processi.
Puoi allocare un AHardwareBuffer
e utilizzarlo per ottenere un tipo di risorsa EGLClientBuffer
tramite l'estensione eglGetNativeClientBufferANDROID
. Puoi passare questo buffer a eglCreateImageKHR
per creare un tipo di risorsa EGLImage
, che può essere associato a una texture tramite glEGLImageTargetTexture2DOES
sui dispositivi supportati. Ciò può essere utile per creare texture che possono essere condivise tra più processi.
L'API JNI per il buffer hardware nativo (<android/hardware_buffer_jni.h>
) consente di ottenere un oggetto HardwareBuffer
, che è un Parcelable e quindi può essere trasportato tra due processi diversi. In questo modo, la tua app avrà funzionalità simili a quelle di SurfaceFlinger, ad esempio la possibilità di creare una coda di buffer tra i processi senza accedere alle API Android interne.
Audio
AAudio
AAudio è l'API audio nativa attualmente supportata. Ha sostituito OpenSL ES e offre un supporto migliore per le app audio ad alte prestazioni che richiedono audio a bassa latenza.
Disponibile dal livello API 26.
Libreria: libaaudio
Guida: Guida all'API AAudio
Riferimento: Riferimento all'API AAudio
OpenSL ES
OpenSL ES è un'altra API audio nativa supportata, ma consulta la nota nella guida di seguito.
Disponibile dal livello API 9. Il livello API 14 ha aggiunto il supporto PCM.
Libreria: libOpenSLES
Guida: Guida a OpenSL ES per Android
API Neural Networks
L'API Neural Networks (NNAPI) fornisce alle app l'accelerazione hardware per le operazioni di machine learning on-device. L'API supporta la creazione, la compilazione e l'esecuzione di modelli sul dispositivo. In genere le app non utilizzano direttamente NNAPI, ma l'API è pensata per essere chiamata da librerie, framework e strumenti di machine learning che consentono agli sviluppatori di addestrare i propri modelli e di distribuirli sui dispositivi Android.
Disponibile dal livello API 27.
Libreria: libneuralnetworks
Guida: Guida alle reti neurali
Riferimento: Riferimento all'API Neural Networks