Neon support

The NDK supports ARM Advanced SIMD, commonly known as Neon, an optional instruction set extension for ARMv7 and ARMv8. Neon provides scalar/vector instructions and registers (shared with the FPU) comparable to MMX/SSE/3DNow! in the x86 world.

All ARMv8-based ("arm64") Android devices support Neon. Almost all ARMv7-based ("32-bit") Android devices support Neon, including all devices that shipped with API level 21 or later. The NDK enables Neon by default for both.

If you target very old devices, you can filter out incompatible devices on the Google Play Console. You can also use the console for your app to see how many devices this would affect.

Alternatively, for maximum compatibility, 32-bit code can perform runtime detection to confirm that Neon code can be run on the target device. An app can perform this check using any of the options mentioned in CPU features.

You can use Neon intrinsics in C and C++ code to take advantage of the Advanced SIMD extension. The Neon Programmer's Guide for Armv8-A provides more information about Neon intrinsics and Neon programming in general.

Build

Disable Neon globally

ndk-build

ndk-build does not support disabling Neon globally. To disable Neon an entire ndk-build application, apply the per-module steps to every module in your application.

CMake

Pass -DANDROID_ARM_NEON=ON when invoking CMake. If building with Android Studio/Gradle, set the following option in your build.gradle:

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

Disable Neon per module

ndk-build

To build all the source files in an ndk-build module without Neon, add the following to the module definition in your Android.mk:

LOCAL_ARM_NEON := false

CMake

To build all the source files in a CMake target without Neon, add the following to your CMakeLists.txt:

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

Where ${TARGET} is replaced with the name of your library.

Cross-platform support for x86

NDK supports cross-platform compilation of your existing ARM SIMD (Neon) instrinsic functions into x86 SSE code, through the use of the third-party NEON_2_SSE.h. For more information on this topic, see From ARM NEON to Intel SSE-the automatic porting solution, tips and tricks.

Sample code

The hello-neon sample provides an example of how to use the cpufeatures library and Neon intrinsics at the same time. This sample implements a tiny benchmark for a FIR filter loop with a C version and a Neon-optimized version for devices that support Neon.