Istnieje kilka sposobów sprawdzania funkcji procesora w kodzie, z których każdy ma inne zalety i wady.
ABI: używanie wstępnie zdefiniowanych makr preprocesora
Zwykle najwygodniej jest określić ABI w czasie kompilacji za pomocą #ifdef
w połączeniu z:
__arm__w przypadku 32-bitowej architektury ARM;__aarch64__w przypadku 64-bitowych procesorów ARM;__i386__w przypadku 32-bitowego procesora X86;__x86_64__w przypadku 64-bitowej architektury X86
Pamiętaj, że 32-bitowa architektura X86 jest oznaczona jako __i386__, a nie __x86__, jak można by się spodziewać.
Liczba rdzeni procesora: użyj funkcji sysconf(3) z biblioteki libc
Funkcja sysconf(3) umożliwia sprawdzanie zarówno wartości _SC_NPROCESSORS_CONF (liczby rdzeni procesora w systemie), jak i _SC_NPROCESSORS_ONLN (liczby rdzeni procesora aktualnie online).
Funkcje: używanie funkcji getauxval(3) z biblioteki libc
W przypadku interfejsu API na poziomie 18 i nowszych funkcja getauxval(3) jest dostępna w bibliotece C Androida. Argumenty AT_HWCAP i AT_HWCAP2 zwracają maski bitowe zawierające listę funkcji specyficznych dla procesora. W różnych hwcap.hnagłówkach NDK
znajdziesz stałe, z którymi możesz porównywać wartości, np. HWCAP_SHA512
instrukcje SHA512 dla arm64 lub HWCAP_IDIVTinstrukcje dzielenia liczb całkowitych Thumb dla arm.
Biblioteka Google cpu_features
Jednym z problemów z AT_HWCAP jest to, że czasami urządzenia są mylone. Niektóre starsze urządzenia na przykład twierdzą, że mają instrukcje dzielenia całkowitego, ale ich nie mają.
Biblioteka cpu_features Google rozwiązuje takie problemy, wykorzystując własną wiedzę o konkretnych układach SoC (analizując /proc/cpuinfo, aby określić, o który układ SoC chodzi).
Ta biblioteka jest utrzymywana na potrzeby zespołów Google zajmujących się aplikacjami własnymi i zawiera obejścia wszystkich problematycznych urządzeń, z którymi się spotkali.
Biblioteka NDK cpufeatures (wycofana)
NDK nadal udostępnia przestarzałą bibliotekę o nazwie cpufeatures, aby zapewnić zgodność kodu źródłowego z aplikacjami, które już jej używają. W przeciwieństwie do nowszej i bardziej kompletnej biblioteki cpu_features ta starsza biblioteka nie zawiera obejść dla tak wielu konkretnych układów SoC.