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 могут потребоваться другие инструменты.