NDK, ndk-build ve CMake için resmi destek içerir. Çoğu kullanıcı, uygulama kodu oluştururken bu kılavuzlardan birine başvurmalıdır. Bu belgenin amacı, diğer derleme sistemlerini kullanan mevcut kodların nasıl oluşturulacağını açıklamaktır. Bu durum, genellikle OpenSSL ve libbzip2 gibi Android'e özgü olmayan üçüncü taraf bağımlılıklarında geçerlidir.
Derleme sistemlerine yerel NDK desteği eklemek isteyen sistem geliştiricileri, bunun yerine Derleme Sistemi Bakımı Kılavuzu'nu okumalıdır.
Genel bakış
NDK'daki Clang derleyicisi, hedef ortamınızı tanımlamak için gereken çok az yapılandırmayla kullanılabilir.
Doğru mimariye yönelik derleme yaptığınızdan emin olmak için Clang'ı çağırırken uygun hedefi -target
ile iletin veya hedef önekli Clang'ı çağırın. Örneğin, 64 bit ARM Android için 21 değerini minSdkVersion
olarak derlemek amacıyla aşağıdakilerden birini yapabilirsiniz. Sizin için en uygun olanı kullanabilirsiniz:
$ $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
Her iki durumda da aşağıdaki tabloya göre indirdiğiniz NDK ile eşleşmesi için $NDK
kısmını NDK'nın yoluyla, $HOST_TAG
ile değiştirin:
NDK OS Varyantı | Barındırıcı Etiketi |
---|---|
macOS | darwin-x86_64 |
Linux | linux-x86_64 |
64 bit Windows | windows-x86_64 |
Burada önek veya hedef bağımsız değişkenin biçimi, minSdkVersion
belirten bir son ek ile hedef üçlüdür. Bu son ek yalnızca clang/clang++ ile kullanılır. binutils araçları (ar
ve strip
gibi) minSdkVersion
ürününden etkilenmedikleri için son ek gerektirmez. Android'in desteklediği
hedef üçlüler şunlardır:
ABI | Triple |
---|---|
Armeabi-v7a | armv7a-linux-androideabi |
kol64-v8a | aarch64-linux-android |
86 x | i686-linux-android |
x86-64 | x86_64-linux-android |
Birçok projenin derleme komut dosyaları, her derleyicinin yalnızca bir işletim sistemi/mimari kombinasyonunu hedeflediği ve bu nedenle -target
düzgün bir şekilde işleyemeyeceği GCC tarzı çapraz derleyiciler bekler. Bu durumlarda, genellikle -target
bağımsız değişkenini derleyici tanımının (ör. CC="clang -target
aarch64-linux-android21
) bir parçası olarak dahil edebilir veya üç ön ekli Clang ikili kodlarını kullanabilirsiniz.
Otomatik konferans
Autoconf projeleri, ortam değişkenleriyle kullanılacak araç zincirini belirtmenize olanak tanır. Örneğin, aşağıda Linux'ta minSdkVersion
API düzeyi 21 ile Android x86-64 için libpng
oluşturma gösterilmektedir.
# 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
Bu örnekte seçilen araçlar NDK r22 ve daha yeni sürümler için doğrudur. Eski NDK'lar farklı araçlar gerektirebilir.
Otomatik yapılandırma olmayan proje oluşturma
Bazı makefile projeleri, bir autoconf projesinde yapacağınız değişkenleri geçersiz kılarak çapraz derlemeye izin verir. Örnek olarak, aşağıda minSdkVersion
/21 ile Android x86-64 için nasıl libbzip2
oluşturulacağı gösterilmektedir.
# 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
Bu örnekte seçilen araçlar NDK r22 ve daha yeni sürümler için doğrudur. Eski NDK'lar farklı araçlar gerektirebilir.