NDK'yı diğer derleme sistemleriyle kullanma

NDK, ndk-build ve CMake için resmi destek sunar. Ç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 kodun 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ı için geçerlidir.

Derleme sistemlerine yerel NDK desteği eklemek isteyen derlemeler, Sistem Bakım Uzmanları Kılavuzu'nda okunmalıdır.

Genel bakış

NDK'daki Clang derleyici, hedef ortamınızı tanımlamak için gereken minimum yapılandırmayla kullanılabilir.

Doğru mimariyi oluşturduğunuzdan emin olmak için Clang'ı çağırırken uygun hedefi -target ile aktarın veya hedef öneki olan Clang'ı çağırın. Örneğin, 24 öğeli minSdkVersion ile 64 bit ARM Android için derleme yapmak üzere aşağıdakilerden herhangi biri kullanılabilir ve 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 NDK ile eşleştirmek için $NDK yerine NDK ve $HOST_TAG yazın:

NDK OS Varyantı Ana Makine Etiketi
macOS darwin-x86_64
Linux linux-x86_64
64 bit Windows windows-x86_64

Buradaki ön ekin veya hedef bağımsız değişkenin biçimi, minSdkVersion belirten bir sonek ile üçlü hedeftir. Bu son ek yalnızca clang/clang++ ile kullanılır; bintillet araçları (ar ve strip gibi) minSdkVersion tarafından etkilenmediğinden sonek gerektirmez. Android'in desteklediği hedef üçlüler şöyledir:

ABI Triple
armeabi-v7a armv7a-linux-androideabi
kol 64-v8a aarch64-linux-android
x86 i686-linux-android
x86-64 x86_64-linux-android

Birçok projenin derleme komut dosyası, her derleyicinin yalnızca bir işletim sistemi/mimari kombinasyonunu hedeflediği ve bu nedenle -target işlevini sorunsuz bir şekilde işleyemeyeceği GCC tarzı çapraz derleyiciler bekler. Böyle 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 ekleyebilir veya üçlü önek Clang ikili programlarını kullanabilirsiniz.

Otomatik Konferans

Autoconf projeleri, ortam değişkenleriyle kullanılacak araç zincirini belirtmenizi sağlar. Örneğin, Linux'ta minSdkVersion API düzeyi 21 ile Android x86-64 için libpng öğesinin nasıl oluşturulacağı aşağıda 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 uygundur. Daha eski NDK'ler için farklı araçlar gerekebilir.

Otomatik olmayan gizli proje oluşturma

Bazı makefile projeleri, bir Autoconf projesiyle aynı değişkenleri geçersiz kılarak çapraz derlemeye izin verir. Aşağıdaki örnekte örnek olarak, Android x86-64 için minSdkVersion öğesinin 21 ile libbzip2 nasıl 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 uygundur. Daha eski NDK'ler için farklı araçlar gerekebilir.