Pakiet NDK zapewnia oficjalną obsługę standardów ndk-build i CMake. Większość użytkowników powinna skorzystać z jednego z tych przewodników dotyczących tworzenia kodu aplikacji. Ten dokument zawiera informacje o tym, jak tworzyć istniejący kod za pomocą innych systemów kompilacji. Często dzieje się tak w przypadku zależności innych firm, które nie są związane z Androidem, takich jak OpenSSL czy libbzip2.
Osoby zajmujące się obsługą systemów kompilacji, które chcą dodać do swoich systemów kompilacji natywną obsługę NDK, powinni zapoznać się z przewodnikiem dla właścicieli systemów (Build System Companion).
Przegląd
Do zdefiniowania środowiska docelowego można używać kompilatora Clang w pakiecie NDK.
Aby mieć pewność, że tworzysz kompilację pod kątem prawidłowej architektury, podczas wywoływania Clang przekaż odpowiedni cel za pomocą elementu -target
lub wywołaj Clang z prefiksem docelowym. Na przykład do kompilacji pod kątem 64-bitowej procesora ARM na Androida z minSdkVersion
o wartości 21 będzie działać jedna z tych metod i możesz użyć tej, która Ci odpowiada:
$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/clang++ \
-target aarch64-linux-android21 foo.cpp
$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/aarch64-linux-android21-clang++ \
foo.cpp
W obu przypadkach zastąp $NDK
ścieżką do pakietu NDK i $HOST_TAG
, aby dopasować go do pobranego pakietu NDK zgodnie z tabelą poniżej:
Wariant systemu operacyjnego NDK | Tag hosta |
---|---|
macOS, | darwin-x86_64 |
Linux | linux-x86_64 |
Windows 64-bitowy | windows-x86_64 |
Format prefiksu lub argumentu docelowego to potrójny element docelowy z sufiksem oznaczającym minSdkVersion
. Ten sufiks jest używany tylko z clang/clang++. Narzędzia binutils (takie jak ar
i strip
) nie wymagają sufiksu, ponieważ minSdkVersion
nie ma na nie wpływu. Android obsługuje trójki docelowe:
Interfejs ABI | Triple |
---|---|
Armeabi-V7a | armv7a-linux-androideabi |
Arm64-V8a | aarch64-linux-android |
x86 | i686-linux-android |
x86–64 | x86_64-linux-android |
Skrypty kompilacji w wielu projektach uwzględniają kompilatory krzyżowe w stylu GCC, w których każdy kompilator jest kierowany tylko na 1 kombinację systemu operacyjnego i architektury, przez co może nie obsługiwać funkcji -target
w czytelny sposób. W takich przypadkach można zwykle dodać argument -target
do definicji kompilatora (np. CC="clang -target
aarch64-linux-android21
) lub użyć plików binarnych Clang z 3 prefiksami.
Automatyczna konfiguracja
Projekty Autoconf umożliwiają określenie łańcucha narzędzi do używania ze zmiennymi środowiskowymi. Poniższy przykład pokazuje, jak utworzyć libpng
na Androida x86-64 z minSdkVersion
poziomu API 21 w systemie Linux.
# Check out the source. git clone https://github.com/glennrp/libpng -b v1.6.37 cd libpng
# Only choose one of these, depending on your build machine... export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64 export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
# Only choose one of these, depending on your device... export TARGET=aarch64-linux-android export TARGET=armv7a-linux-androideabi export TARGET=i686-linux-android export TARGET=x86_64-linux-android
# Set this to your minSdkVersion. export API=21
# Configure and build. export AR=$TOOLCHAIN/bin/llvm-ar export CC=$TOOLCHAIN/bin/$TARGET$API-clang export AS=$CC export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++ export LD=$TOOLCHAIN/bin/ld export RANLIB=$TOOLCHAIN/bin/llvm-ranlib export STRIP=$TOOLCHAIN/bin/llvm-strip ./configure --host $TARGET make
Narzędzia wybrane w tym przykładzie są prawidłowe dla wersji NDK r22 i nowszych. Starsze pakiety NDK mogą wymagać różnych narzędzi.
Tworzenie projektów bez konfiguracji automatycznej konfiguracji
Niektóre projekty Makefile umożliwiają kompilację krzyżową przez zastąpienie tych samych zmiennych, które byłyby stosowane w projekcie Autoconf. Przykład poniżej pokazuje, jak utworzyć libbzip2
na Androida w wersji x86-64 z minSdkVersion
o wartości 21.
# Check out the source.
git clone https://gitlab.com/bzip/bzip2.git
cd bzip2
# Only choose one of these, depending on your build machine...
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
# Only choose one of these, depending on your device...
export TARGET=aarch64-linux-android
export TARGET=armv7a-linux-androideabi
export TARGET=i686-linux-android
export TARGET=x86_64-linux-android
# Set this to your minSdkVersion.
export API=21
# Build.
make \
CC=$TOOLCHAIN/bin/$TARGET$API-clang \
AR=$TOOLCHAIN/bin/llvm-ar \
RANLIB=$TOOLCHAIN/bin/llvm-ranlib \
bzip2
Narzędzia wybrane w tym przykładzie są prawidłowe dla wersji NDK r22 i nowszych. Starsze pakiety NDK mogą wymagać różnych narzędzi.