Pakiet NDK zawiera oficjalną obsługę procesów ndk-build i CMake. Większość użytkowników powinna znajdziesz w jednym z tych przewodników dotyczących tworzenia kodu aplikacji. Cel ten dokument opisuje, jak utworzyć istniejący kod wykorzystujący inną kompilację systemów uczących się. Dzieje się tak często w przypadku zależności zewnętrznych, specyficzne dla Androida, np. OpenSSL czy libbzip2;
Stworzenie zespołu obsługi systemu, który chce dodać do kompilacji natywną obsługę NDK powinni zapoznać się z przewodnikiem dla administratorów systemów tworzenia systemów.
Omówienie
Kompilator Clang w NDK jest użyteczny przy minimalnej konfiguracji wymagane do zdefiniowania środowiska docelowego.
Aby mieć pewność, że kompilacja będzie działać prawidłowo, przekaż odpowiednią architekturę
ustaw kierowanie na -target
podczas wywoływania Clang. Na przykład do skompilowania pliku w wersji 64-bitowej
Procesor ARM z Androidem z kodem minSdkVersion
o wartości 21:
$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/clang++ \
--target aarch64-linux-android21 foo.cpp
Istnieją też punkty wejścia z prefiksem celu dla języka Clang. Mogą to być
dowiązania symboliczne albo skrypty przekierowujące do clangu, w zależności od wersji NDK
i systemu operacyjnego hosta. Bezpośrednie wywoływanie języka Clang za pomocą funkcji --target
będzie bardziej niezawodne, ponieważ
to najczęściej testowany przepływ pracy. Od czasu do czasu są też argumenty
w scenariuszach. W Windowsie do przekazywania dalej potrzeba dodatkowych CreateProcess
od skryptu do prawdziwego kompilatora może potencjalnie
mają negatywny wpływ na szybkość kompilacji.
$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/aarch64-linux-android21-clang++ \
foo.cpp
W obu przypadkach zastąp $NDK
ścieżką do NDK i $HOST_TAG
, aby dopasować
pobranego pakietu NDK zgodnie z tą tabelą:
Wariant systemu operacyjnego NDK | Tag hosta |
---|---|
macOS, | darwin-x86_64 |
Linux | linux-x86_64 |
64-bitowy Windows | windows-x86_64 |
Format prefiksu lub argumentu docelowego to potrójna wartość docelowa ze znakiem
sufiks wskazujący minSdkVersion
. Ten sufiks jest używany tylko z:
clang/clang++; narzędzia binutils (takie jak ar
i strip
) nie wymagają
sufiks, bo minSdkVersion
nie ma na nie wpływu. Obsługiwane na Androidzie
są następujące trójki, które są celem kierowania:
Interfejs ABI | Triple |
---|---|
Armeabi-V7a | armv7a-linux-androideabi |
Arm64-V8a | aarch64-linux-android |
x86 | i686-linux-android |
x86–64 | x86_64-linux-android |
Wiele projektów skrypty kompilacji będą korzystać z kompilacji krzyżowych w stylu GCC.
kompilator jest kierowany tylko na jedną kombinację systemu operacyjnego i architektury, więc może nie obsługiwać
-target
. W takich przypadkach zazwyczaj można dodać -target
jako część definicji kompilatora (np. CC="clang -target
aarch64-linux-android21
). W rzadkich przypadkach, gdy używany przez Ciebie system kompilacji
nie możesz użyć tego formularza, użyj plików binarnych Clang z potrójnym prefiksem.
Automatyczna konfiguracja
Projekty Autoconf umożliwiają określenie łańcucha narzędzi do użycia ze środowiskiem
zmiennych. Na przykład poniżej pokazujemy, jak utworzyć libpng
na Androida
x86-64 z minSdkVersion
na poziomie 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/clang --target=$TARGET$API" export AS=$CC export CXX="$TOOLCHAIN/bin/clang++ --target=$TARGET$API" 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ą poprawne dla NDK r22 i nowszych. Starsze NDK może wymagać użycia innych narzędzi.
Tworzenie projektów bez konfiguracji automatycznej konfiguracji
Niektóre projekty Makefile umożliwiają kompilację krzyżową przez zastąpienie tych samych zmiennych
jak w przypadku projektu autoconf. Na przykład poniżej pokazujemy, jak
aby 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/clang --target=$TARGET$API" \
AR=$TOOLCHAIN/bin/llvm-ar \
RANLIB=$TOOLCHAIN/bin/llvm-ranlib \
bzip2
Narzędzia wybrane w tym przykładzie są poprawne dla NDK r22 i nowszych. Starsze NDK może wymagać użycia innych narzędzi.