Suporte a Neon

O NDK é compatível com o ARM Advanced SIMD, mais conhecido como Neon, uma extensão de conjunto de instruções opcional para ARMv7 e ARMv8. O Neon oferece registros e instruções de escala/vetor (compartilhados com a FPU) comparáveis a MMX/SSE/3DNow! da arquitetura x86.

Todos os dispositivos Android baseados em ARMv8 ("arm64") são compatíveis com o Neon. Quase todos os dispositivos Android baseados em ARMv7 ("32 bits") são compatíveis com o Neon, incluindo todos os dispositivos que vêm com o nível 21 da API ou mais recente. O NDK ativa o Neon por padrão para ambos.

Se você segmentar dispositivos muito antigos, poderá filtrar os dispositivos incompatíveis no Google Play Console. Você também pode usar o console do seu app para ver quantos dispositivos isso afetaria.

Como alternativa, para máxima compatibilidade, o código de 32 bits pode realizar detecção no ambiente de execução para confirmar se o código neon pode ser executado no dispositivo de destino. Um app pode realizar essa verificação usando qualquer uma das opções mencionadas em Recursos da CPU.

Você pode usar os intrínsecos do Neon (link em inglês) no código C e C++ para aproveitar a extensão Advanced SIMD. O Guia do programador do Neon para Armv8-A (link em inglês) traz mais informações específicas sobre os intrínsecos e a programação do Neon, em geral.

Criar

Desativar o Neon globalmente

ndk-build

O ndk-build não tem suporte à desativação do Neon globalmente. Para desativar o Neon em todo o app ndk-build, aplique as etapas a cada módulo do app.

CMake

Transmita -DANDROID_ARM_NEON=ON ao invocar o CMake. Ao criar com o Android Studio/Gradle, defina a seguinte opção no build.gradle:

android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                arguments "-DANDROID_ARM_NEON=OFF"
            }
        }
    }
}

Desativar o Neon por módulo

ndk-build

Para criar todos os arquivos de origem em um módulo ndk-build sem o Neon, adicione o seguinte à definição do módulo no Android.mk:

LOCAL_ARM_NEON := false

CMake

Para criar todos os arquivos de origem em um destino do CMake sem o Neon, adicione o seguinte ao seu CMakeLists.txt:

if(ANDROID_ABI STREQUAL armeabi-v7a)
    set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS -mfpu=vfpv3-d16)
endif()

Em que ${TARGET} é substituído pelo nome da sua biblioteca.

Compatibilidade entre plataformas para x86

O NDK é compatível com a compilação entre plataformas das funções intrínsecas ARM SIMD (Neon) existentes para o código SSE x86 por meio do uso de NEON_2_SSE.h de terceiros. Para mais informações sobre esse assunto, consulte Do ARM NEON para o Intel SSE: a solução de portabilidade automática, dicas e sugestões (links em inglês).

Exemplo de código

A amostra hello-neon (link em inglês) traz um exemplo de como usar a biblioteca cpufeatures e intrínsecos do Neon ao mesmo tempo. Essa amostra implementa um pequeno comparativo para um loop de filtro FIR com uma versão C, além de implementar uma versão otimizada para Neon para dispositivos compatíveis com Neon.