Es gibt mehrere Möglichkeiten, CPU-Funktionen in Ihrem Code zu prüfen. Jede hat ihre Vor- und Nachteile.
ABI: Vordefinierte Makros des Präprozessors verwenden
Normalerweise ist es am einfachsten, das ABI zur Build-Zeit mit #ifdef in Verbindung mit Folgendem zu bestimmen:
__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
32-Bit-X86 wird als __i386__ bezeichnet, nicht als __x86__, wie Sie vielleicht erwarten.
Anzahl der CPU-Kerne: libc-Funktion sysconf(3) 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 befindlichen CPU-Kerne) abfragen.
Funktionen: libc-Funktion getauxval(3) 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, in denen CPU-spezifische Funktionen aufgeführt sind. Die verschiedenen hwcap.h-Header im NDK enthalten die Konstanten, mit denen verglichen werden kann, z. B. HWCAP_SHA512 für die SHA512-Anweisungen von arm64 oder HWCAP_IDIVT für die Thumb-Ganzzahldivisionsanweisungen von arm.
Die Google-Bibliothek „cpu_features“
Ein Problem bei AT_HWCAP ist, dass Geräte manchmal verwechselt werden. Einige alte Geräte geben beispielsweise an, dass sie über Anweisungen zur Ganzzahldivision verfügen, was aber nicht der Fall ist.
Die cpu_features-Bibliothek von Google umgeht solche Probleme, indem sie ihr eigenes Wissen über bestimmte SoCs anwendet. Dazu wird /proc/cpuinfo geparst, um das jeweilige SoC zu ermitteln.
Diese Bibliothek wird von den Teams für eigene Apps von Google verwaltet und enthält Workarounds für alle problematischen Geräte, die ihnen bekannt sind.
Die NDK-Bibliothek „cpufeatures“ (eingestellt)
Das NDK bietet weiterhin eine eingestellte Bibliothek namens cpufeatures für die Quellkompatibilität mit Apps, die sie bereits verwenden. Im Gegensatz zur neueren und umfassenderen Bibliothek cpu_features bietet diese ältere Bibliothek nicht für so viele spezifische SoCs Workarounds.