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.