Neon-Unterstützung

Der NDK unterstützt ARM Advanced SIMD, auch bekannt als Neon, eine optionale Erweiterung für Anleitungssätze für ARMv7 und ARMv8. Neon bietet Skalar-/Vektoranweisungen und -register (gemeinsam mit der FPU), vergleichbar mit MMX/SSE/3DNow! in der x86-Welt.

Alle ARMv8-basierten Android-Geräte („arm64“) unterstützen Neon. Fast alle ARMv7-basierten Android-Geräte (32-Bit) unterstützen Neon, einschließlich aller Geräte, die mit API-Level 21 oder höher ausgeliefert wurden. Der NDK aktiviert Neon standardmäßig für beide.

Wenn Sie Ihre Anzeigen auf sehr alte Geräte ausrichten, können Sie inkompatible Geräte in der Google Play Console herausfiltern. Sie können auch die Konsole für Ihre App verwenden, um zu sehen, wie viele Geräte davon betroffen wären.

Alternativ kann für maximale Kompatibilität mit 32-Bit-Code eine Laufzeiterkennung durchgeführt werden, um zu bestätigen, dass Neon-Code auf dem Zielgerät ausgeführt werden kann. Eine Anwendung kann diese Prüfung mit jeder der Optionen durchführen, die unter CPU-Features aufgeführt sind.

Sie können die Intrinsik von Neon in C- und C++-Code verwenden, um die Advanced SIMD-Erweiterung zu nutzen. Der Neon-Programmer's Guide für Armv8-A enthält weitere Informationen zur Neon-Intrinsik und zur Neon-Programmierung im Allgemeinen.

Eine Community

Neon global deaktivieren

NDK-Build

ndk-build unterstützt die globale Deaktivierung von Neon nicht. Wenn Sie Neon für eine vollständige ndk-build-Anwendung deaktivieren möchten, wenden Sie die Schritte pro Modul auf jedes Modul in Ihrer Anwendung an.

CMake

Übergeben Sie beim Aufrufen von CMake -DANDROID_ARM_NEON=ON. Wenn du Builds mit Android Studio/Gradle erstellst, lege die folgende Option in „build.gradle“ fest:

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

Neon pro Modul deaktivieren

NDK-Build

Wenn Sie alle Quelldateien in einem ndk-build-Modul ohne Neon erstellen möchten, fügen Sie der Moduldefinition in Android.mk Folgendes hinzu:

LOCAL_ARM_NEON := false

CMake

Wenn Sie alle Quelldateien in einem CMake-Ziel ohne Neon erstellen möchten, fügen Sie der Datei „CMakeLists.txt“ Folgendes hinzu:

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

Dabei wird ${TARGET} durch den Namen Ihrer Bibliothek ersetzt.

Plattformübergreifende Unterstützung für x86

NDK unterstützt die plattformübergreifende Kompilierung vorhandener ARM SIMD-(Neon-)Installationsfunktionen in x86-SSE-Code mithilfe des Drittanbieters NEON_2_SSE.h. Weitere Informationen zu diesem Thema finden Sie unter Von ARM NEON zur Intel SSE – der automatischen Portierungslösung: Tipps und Tricks.

Beispielcode

Das hello-neon-Beispiel enthält ein Beispiel für die gleichzeitige Verwendung der cpufeatures-Bibliothek und der Neon-Funktionen. Dieses Beispiel implementiert einen winzigen Benchmarkwert für eine FIR-Filterschleife mit einer C-Version und einer Neon-optimierten Version für Geräte, die Neon unterstützen.