APIs nativas do Android NDK

Esta página oferece uma visão geral das bibliotecas incluídas no NDK, com links para as partes relevantes da referência da API NDK e para guias (se disponíveis).

Como usar APIs nativas

Há duas etapas para usar uma biblioteca fornecida pelo NDK:

  1. Dizer ao sistema de compilação para vincular à biblioteca.

    • Se você estiver usando ndk-build: adicione a biblioteca a LOCAL_LDLIBS do Android.mk. É necessário tirar o lib principal e dizer -l. Por exemplo, para vincular a libfoo e libbar, você escreveria makefile LOCAL_LDLIBS := -lfoo -lbar

      Para saber mais sobre LOCAL_LDLIBS, consulte a documentação do Android.mk.

    • Se você estiver usando CMake: siga as instruções do documento Adicionar APIs NDK do Studio.

  2. #include os cabeçalhos adequados do seu código.

C/C++ principal

Biblioteca C

Os cabeçalhos da biblioteca C11 padrão, como <stdlib.h> e <stdio.h>, estão disponíveis normalmente.

No Android, diferentemente do Linux, não há bibliotecas libpthread ou librt separadas. Essa funcionalidade é incluída diretamente em libc, que não precisa ser vinculado de forma explícita.

Há um libm separado para funções matemáticas (seguindo a tradição usual do Unix), mas assim como libc, isso é automaticamente vinculado pelos sistemas de compilação.

A funcionalidade do vinculador dinâmico em <dlfcn.h>, como dlopen(3) e dlsym(3), está disponível, mas é necessário vincular libdl explicitamente.

Biblioteca: libc / libm / libdl

Biblioteca C++

A compatibilidade com C++17 está disponível. Para saber mais sobre a compatibilidade com a biblioteca C++, consulte Compatibilidade com a biblioteca C++.

Gerar registros

<android/log.h> contém APIs para a geração de registros no logcat.

Disponível desde a API de nível 3.

Biblioteca: liblog

Referência: Geração de registros

Rastreamento

A API de rastreamento nativo <android/trace.h> fornece o equivalente nativo da classe android.os.Trace na linguagem de programação Java. Essa API permite que você rastreie unidades de trabalho nomeadas no seu código programando eventos de rastreamento para o buffer de rastreamento do sistema. Então, é possível coletar e analisar os eventos de rastreamento usando a ferramenta Systrace.

Disponível desde a API de nível 23.

Biblioteca: libandroid

Guia: Rastreamento nativo

Compactação zlib

Você pode usar a Biblioteca de compactação Zlib (link em inglês), incluindo <zlib.h> e vinculando a libz.

Disponível desde a API de nível 3.

Biblioteca: libz

Gráficos

OpenGL ES 1.0 - 3.2

Os cabeçalhos padrão da OpenGL ES 1.x (<GLES/gl.h> e <GLES/glext.h>), cabeçalhos 2.0 (<GLES2/gl2.h> e <GLES2/gl2ext.h>), cabeçalhos 3.0 (<GLES3/gl3.h> e <GLES3/gl3ext.h>), cabeçalhos 3.1 (<GLES3/gl31.h> e <GLES3/gl3ext.h>) e os cabeçalhos 3.2 (<GLES3/gl32.h> e <GLES3/gl3ext.h>) contêm as declarações necessárias para a OpenGL ES.

Para usar a OpenGL ES 1.x, vincule seu módulo nativo a libGLESv1_CM.

Para usar a OpenGL ES 2.0, vincule seu módulo nativo a libGLESv2.

Para usar a OpenGL ES 3.x, vincule seu módulo nativo a libGLESv3.

Todos os dispositivos com Android são compatíveis com OpenGL ES 1.0 e 2.0.

Somente dispositivos Android com a GPU necessária são compatíveis com versões posteriores da OpenGL ES, mas as bibliotecas estão presentes em todos os dispositivos compatíveis com o nível da API em que foram inseridos. É seguro vincular às bibliotecas, mas um app precisa consultar a string de extensão e a string da versão OpenGL ES para determinar se o dispositivo atual é compatível com os recursos necessários. Para saber mais sobre como realizar essa consulta, veja a descrição de glGetString() na especificação da OpenGL.

Além disso, coloque uma tag <uses-feature> no seu arquivo de manifesto para indicar a versão do OpenGL ES necessária.

A OpenGL ES 1.0 está disponível a partir do nível 4 da API.

A OpenGL ES 2.0 está disponível a partir do nível 5 da API.

A OpenGL ES 3.0 está disponível a partir do nível 18 da API.

A OpenGL ES 3.1 está disponível a partir do nível 21 da API.

A OpenGL ES 3.2 está disponível a partir do nível 24 da API.

EGL

A biblioteca EGL oferece uma interface de plataforma nativa por meio dos cabeçalhos <EGL/egl.h> e <EGL/eglext.h> para alocação e gerenciamento de contextos e superfícies da OpenGL ES.

A EGL permite realizar as seguintes operações a partir do código nativo:

  • Listar configurações de EGL compatíveis
  • Alocar e lançar superfícies da OpenGL ES.
  • Criar e destruir contextos da OpenGL ES.
  • Trocar ou inverter superfícies

O nível 24 da API trouxe compatibilidade com as extensões EGL_KHR_mutable_render_buffer, ANDROID_create_native_client_buffer e ANDROID_front_buffer_auto_refresh.

Disponível a partir do nível 9 da API.

Biblioteca: libEGL

Guia: Interface de plataforma nativa EGL (em inglês)

Vulkan

O Vulkan é uma API multiplataforma de baixa sobrecarga para renderizar gráficos 3D de alto desempenho. Vulkan é um padrão aberto mantido pelo Khronos Group. O arquivo principal <vulkan/vulkan.h> padrão contém as declarações necessárias para executar chamadas de renderização da Vulkan a partir do seu código.

Para ver amostras de código, consulte os projetos LunarG VulkanSamples e android-vulkan-tutorials no GitHub (links em inglês).

A biblioteca Vulkan está presente em todos os dispositivos compatíveis com a API de nível 24 ou mais recente, mas os aplicativos precisam verificar no momento da execução se o suporte de hardware da GPU está disponível. Os dispositivos sem compatibilidade com a Vulkan retornarão zero dispositivos de vkEnumeratePhysicalDevices (link em inglês).

Disponível a partir do nível 24 da API.

Biblioteca: libvulkan

Guia: Guia da Vulkan

Bitmaps

A biblioteca libjnigraphics expõe a API que permite acesso aos buffers de pixel dos objetos Java Bitmap. O fluxo de trabalho é o seguinte:

  1. Chame AndroidBitmap_getInfo() para recuperar informações, como largura e altura, sobre um determinado identificador de bitmap.

  2. Chame AndroidBitmap_lockPixels() para bloquear o buffer de pixels e recuperar um ponteiro para ele. Isso garante que os pixels não se movam até que o app chame AndroidBitmap_unlockPixels().

  3. Modifique o buffer de pixels conforme apropriado para seu formato de pixel, largura e outras características.

  4. Chame AndroidBitmap_unlockPixels() para desbloquear o buffer.

Disponível desde a API de nível 8.

Biblioteca: libjnigraphics

Referência: Referência da API Bitmap

API Sync

Disponível a partir do nível 26 da API.

Biblioteca: libsync

Referência: Referência da API Sync

Câmera

As APIs nativas de câmeras executam captura e processamento de fotos refinadas. Diferentemente da API Java camera2, a API nativa de câmera não é compatível com implementações obsoletas HAL 1.0 de câmera. Ou seja, a lista de câmeras disponíveis na API nativa da câmera não incluirá dispositivos de câmera que tenham o nível de hardware LEGACY.

Disponível a partir do nível 24 da API.

Biblioteca: libcamera2ndk

Referência: Referência da API Camera

Mídia

libmediandk

As APIs Media fornecem interfaces nativas de baixo nível semelhantes a MediaExtractor, MediaCodec e outras APIs Java relacionadas.

Biblioteca: libmediandk

Referência: Referência da API Media

OpenMAX AL

O gerenciamento nativo de multimídia do Android se baseia na API OpenMAX AL 1.0.1 do Khronos Group.

Os cabeçalhos OpenMAX AL padrão <OMXAL/OpenMAXAL.h> e <OMXAL/OpenMAXAL_Platform.h> contêm as declarações necessárias para executar a saída de multimídia do lado nativo do Android.

A distribuição do OpenMAX AL do NDK também fornece extensões específicas do Android. Para saber mais sobre essas extensões, consulte os comentários em <OMXAL/OpenMAXAL_Android.h>.

Disponível a partir do nível 14 da API.

Biblioteca: libOpenMAXAL

APIs de aplicativo nativo do Android

Para saber mais, consulte a documentação Referência da API NDK.

As APIs incluem:

Biblioteca: libandroid

Biblioteca: libnativewindow para a função de janela nativa mais recente

Referência completa: Referência da API Android NDK

APIs de buffer de hardware

Duas APIs nativas permitem que você crie seus pipelines para o gerenciamento de buffer em processo cruzado.

A API de buffer de hardware nativo <android/hardware_buffer.h> permite alocar buffers diretamente para criar pipelines próprios para gerenciamento de buffer em processo cruzado. É possível alocar um AHardwareBuffer e usá-lo para ter um tipo de recurso EGLClientBuffer por meio da extensão eglGetNativeClientBufferANDROID. Você pode transmitir esse buffer para eglCreateImageKHR para criar um tipo de recurso EGLImage, que pode então ser vinculado a uma textura via glEGLImageTargetTexture2DOES nos dispositivos compatíveis (links em inglês). Isso pode ser útil para criar texturas que possam ser compartilhadas em processo cruzado.

A API JNI de buffer de hardware nativo (<android/hardware_buffer_jni.h>) permite ter um objeto HardwareBuffer, que é um Parcelable e, portanto, pode ser transportado entre dois processos diferentes. Isso dá ao app capacidades semelhantes a SurfaceFlinger (link em inglês), por exemplo, criar uma fila de buffers própria entre processos sem acessar APIs internas do Android.

Áudio

AAudio

AAudio é a API de áudio nativa compatível atualmente. Ela substituiu a OpenSL ES e oferece melhor compatibilidade com aplicativos de áudio de alto desempenho que exigem áudio de baixa latência.

Disponível a partir do nível 26 da API.

Biblioteca: libaaudio

Guia: Guia da API AAudio

Referência: Referência da API AAudio

OpenSL ES

OpenSL ES é outra API de áudio nativa que também é compatível, mas veja a nota no guia abaixo.

Disponível a partir do nível 9 da API. A API de nível 14 adicionou compatibilidade com PCM.

Biblioteca: libOpenSLES

Guia: Guia da OpenSL ES para Android

API Neural Networks

A API Android Neural Networks (NNAPI) fornece aceleração de hardware aos apps para operações de aprendizado de máquina no dispositivo. A API é compatível com o modelo de criação, compilação e execução no dispositivo. Os apps não costumam usar NNAPI diretamente. Em vez disso, ela precisa ser chamada por bibliotecas de aprendizado de máquina, frameworks e ferramentas que permitam que os desenvolvedores treinem modelos e os implantem em dispositivos Android.

Disponível a partir do nível 27 da API.

Biblioteca: libneuralnetworks

Guia: Guia de redes neurais

Referência: Referência da API Neural Networks