Es gibt mehrere Möglichkeiten, um in Ihrem Code nach CPU-Features zu suchen, die jeweils unterschiedliche Vor- und Nachteile haben.
ABI: Vordefinierte Makros des Präprozessors verwenden
In der Regel ist es am einfachsten, die ABI beim Build mithilfe von #ifdef in Verbindung mit folgenden Faktoren zu ermitteln:
__arm__für 32-Bit-ARM__aarch64__für 64-Bit-ARM__i386__für 32-Bit-X86__x86_64__für 64-Bit-X86
Hinweis: 32-Bit-X86 heißt __i386__ und nicht __x86__, wie du vielleicht erwarten kannst.
Anzahl der CPU-Kerne: sysconf(3) von libc verwenden
Mit sysconf(3) können Sie sowohl _SC_NPROCESSORS_CONF (die Anzahl der CPU-Kerne im System) als auch _SC_NPROCESSORS_ONLN (die Anzahl der derzeit online verfügbaren CPU-Kerne) abfragen.
Features: getauxval(3) von libc verwenden
Ab API-Level 18 ist getauxval(3) in der C-Bibliothek von Android verfügbar. Die Argumente AT_HWCAP und AT_HWCAP2 geben Bitmasken zurück, die CPU-spezifische Funktionen auflisten. Die verschiedenen hwcap.h-Header im NDK finden Sie über die Konstanten, die verglichen werden sollen, z. B. HWCAP_SHA512 für die SHA512-Anweisungen von Arm64 oder HWCAP_IDIVT für die Thumb-Ganzzahldivision von Verzweigung.
Die Google-Bibliothek „cpu_features“
Ein Problem mit AT_HWCAP ist, dass manchmal Geräte falsch sind. Einige alte Geräte behaupten beispielsweise, Anweisungen zur Division nach Ganzzahl zu haben, tun dies aber nicht.
Diese Probleme werden von der CPU_features-Bibliothek von Google umgangen, indem ihr eigenes Wissen über bestimmte SoCs angewendet wird. Dabei wird /proc/cpuinfo geparst, um das betreffende SoC zu ermitteln.
Diese Bibliothek wird für die Nutzung durch die Google-Teams für eigene Apps gepflegt. Sie bietet Problemumgehungen für jedes problematische Gerät, auf das sie gestoßen sind.
Die NDK-cpufeatures-Bibliothek (verworfen)
Das NDK stellt weiterhin eine verworfene Bibliothek mit dem Namen cpufeatures für die Quellkompatibilität mit Anwendungen bereit, die sie bereits verwenden. Im Gegensatz zur neueren und umfassenderen cpu_features-Bibliothek bietet diese historische Bibliothek keine Behelfslösungen für so viele spezifische SoCs.