Compatibilidad con Neon

El NDK admite Advanced SIMD de ARM, más conocida como Neon, una extensión opcional del conjunto de instrucciones para ARMv7 y ARMv8. NEON proporciona instrucciones escalares y vectoriales, así como registros (que se comparten con la FPU) similares a MMX/SSE/3DNow! en el entorno x86.

Todos los dispositivos Android basados en ARMv8 ("arm64") admiten Neon. Casi todos los servidores basados en ARMv7 Los dispositivos Android ("32 bits") admiten Neon, incluidos todos los dispositivos Nivel de API 21 o versiones posteriores El NDK habilita Neon de forma predeterminada para ambos.

Si orienta los anuncios a dispositivos muy antiguos, puede filtrar los dispositivos no compatibles en la Google Play Console También puedes usar la consola para tu app dispositivos afectados.

Como alternativa, para lograr la máxima compatibilidad, el código de 32 bits puede realizar el para confirmar que se puede ejecutar el código de Neon en el dispositivo de destino. Una app puede realiza esta comprobación con cualquiera de las opciones mencionadas en Características de la CPU.

Puedes usar las funciones intrínsecas de Neon en el código C y C++ para aprovechar la extensión Advanced SIMD. La Guía del programador de Neon para Armv8-A proporciona más información sobre los objetos intrínsecos de Neon y la programación de Neon en general.

Compilación

Cómo inhabilitar Neon a nivel global

ndk-build

ndk-build no admite la inhabilitación de Neon a nivel global. Para inhabilitar Neon por completo ndk-build, aplica los pasos por módulo a cada módulo de tu y mantener la integridad de su aplicación.

CMake

Pasa -DANDROID_ARM_NEON=ON cuando invoques a CMake. Si compilas con Android Studio o Gradle, configura la siguiente opción en tu archivo build.gradle:

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

Cómo inhabilitar Neon por módulo

ndk-build

Para compilar todos los archivos de origen en un módulo ndk-build sin Neon, agrega el elemento siguiente a la definición del módulo en tu archivo Android.mk:

LOCAL_ARM_NEON := false

CMake

Para compilar todos los archivos de origen en un destino CMake sin Neon, agrega el elemento siguiente a tu CMakeLists.txt:

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

${TARGET} se reemplaza por el nombre de tu biblioteca.

Compatibilidad entre plataformas para x86

El NDK admite la compilación entre plataformas de tus funciones intrínsecas existentes de ARM SIMD (Neon) en código x86 de SSE por medio del archivo NEON_2_SSE.h de terceros. Para obtener más información sobre este tema, consulta De ARM NEON a Intel SSE: la solución de portabilidad automática, sugerencias y trucos (en inglés).

Código de muestra

La muestra hello-neon proporciona un ejemplo de cómo usar la biblioteca cpufeatures y las funciones intrínsecas de Neon al mismo tiempo. En esta muestra, se implementa una pequeña referencia para un bucle de filtros FIR con una versión C y una optimizada para Neon correspondiente a dispositivos compatibles con Neon.