API native

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:

  1. 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 il lib iniziale e dire -l. Ad esempio, per eseguire il collegamento a libfoo e libbar, 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.

  2. #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:

  1. Chiama AndroidBitmap_getInfo() per recuperare informazioni, come larghezza e altezza, su un determinato handle bitmap.

  2. 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 chiama AndroidBitmap_unlockPixels().

  3. Modifica il buffer dei pixel in base al formato, alla larghezza e ad altre caratteristiche dei pixel.

  4. 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:

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