NDK'yı diğer derleme sistemleriyle kullanma

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.