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 modelos baseados em ARMv7 Os dispositivos Android ("32 bits") são compatíveis com o Neon, incluindo todos os dispositivos que vêm com API de nível 21 ou mais recente. O NDK ativa o Neon por padrão para ambos.

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

Como alternativa, para compatibilidade máxima, códigos de 32 bits podem executar código para confirmar que o código Neon pode ser executado no dispositivo de destino. Um app pode faça essa verificação usando qualquer uma das opções mencionadas 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 é compatível com a desativação do Neon globalmente. Para desativar o Neon em um inteiro ndk-build, aplique as etapas por módulo a cada módulo do para o aplicativo.

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 Neon, adicione a seguindo a definição do módulo no Android.mk:

LOCAL_ARM_NEON := false

CMake

Para criar todos os arquivos de origem em um destino CMake sem Neon, adicione o ao 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.