Używaj NDK z innymi systemami kompilacji

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.