Используйте NDK с другими системами сборки.

NDK содержит официальную поддержку ndk-build и CMake . Большинству пользователей следует обратиться к одному из этих руководств по созданию кода приложения. Цель этого документа — описать, как создавать существующий код, использующий другие системы сборки. Это часто происходит со сторонними зависимостями, не специфичными для Android, такими как OpenSSL и libbzip2.

Специалисты по сопровождению систем сборки, желающие добавить в свои системы сборки встроенную поддержку NDK, должны вместо этого прочитать Руководство для сопровождающих систем сборки .

Обзор

Компилятор Clang в составе NDK можно использовать только с минимальной настройкой, необходимой для определения целевой среды.

Чтобы убедиться, что вы выполняете сборку для правильной архитектуры, передайте соответствующую цель с помощью -target при вызове Clang. Например, для компиляции для 64-разрядной версии ARM Android с minSdkVersion , равным 21, выполните следующие действия:

$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/clang++ \
    --target=aarch64-linux-android21 foo.cpp

Альтернативно, для Clang существуют точки входа с целевым префиксом. Это могут быть либо символические ссылки, либо сценарии, пересылающие на clang, в зависимости от версии NDK и операционной системы хоста. Вызов Clang напрямую с помощью --target будет более надежным, поскольку это наиболее проверенный рабочий процесс, и в сценариях иногда возникают ошибки пересылки аргументов. В Windows дополнительный CreateProcess , необходимый для пересылки из сценария в реальный компилятор, потенциально может оказать заметное негативное влияние на скорость сборки.

$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/aarch64-linux-android21-clang++ \
    foo.cpp

В обоих случаях замените $NDK путем к NDK и $HOST_TAG , чтобы они соответствовали загруженному вами NDK, согласно следующей таблице:

Вариант ОС NDK Тег хоста
macOS darwin-x86_64
Линукс linux-x86_64
64-битная Windows windows-x86_64

Формат префикса или целевого аргумента здесь — целевая тройка с суффиксом, обозначающим minSdkVersion . Этот суффикс используется только с clang/clang++; инструменты binutils (такие как ar и strip ) не требуют суффикса, поскольку на них не влияет minSdkVersion . В Android поддерживаются следующие целевые тройки:

АБИ Тройной
армеаби-v7a armv7a-linux-androideabi
рука64-v8a aarch64-linux-android
х86 i686-linux-android
х86-64 x86_64-linux-android

Сценарии сборки многих проектов предполагают наличие кросс-компиляторов в стиле GCC, где каждый компилятор нацелен только на одну комбинацию ОС/архитектуры и поэтому может не обрабатывать -target четко. В таких случаях вы обычно можете включить аргумент -target как часть определения компилятора (например, CC="clang -target aarch64-linux-android21 ). В редких случаях, когда используемая вами система сборки не может его использовать. используйте двоичные файлы Clang с тройным префиксом.

Автоконф.

Проекты Autoconf позволяют вам указать цепочку инструментов для использования с переменными среды. Например, ниже показано, как собрать libpng для Android x86-64 с minSdkVersion уровня API 21 в 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

Инструменты, выбранные в этом примере, подходят для NDK r22 и новее. Для старых NDK могут потребоваться другие инструменты.

Создание проектов без использования autoconf

Некоторые проекты makefile допускают кросс-компиляцию путем переопределения тех же переменных, что и в проекте autoconf. В качестве примера ниже показано, как собрать libbzip2 для Android x86-64 с minSdkVersion , равным 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

Инструменты, выбранные в этом примере, подходят для NDK r22 и новее. Для старых NDK могут потребоваться другие инструменты.