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şturmak için bu kılavuzlardan birine bakacağız. Amacı Bu belge, başka bir derleme dosyası kullanan mevcut bir sistemlerdir. Bu durum çoğu zaman hedeflenen üçüncü taraf bağımlılıklarında Android'e özgü (ör. OpenSSL ve libbzip2).

Yapılarına yerel NDK desteği eklemek isteyen sistem bakıcıları oluşturun sistemlerinin Sistem Bakımı Kılavuzu'nu okuması gerekir.

Genel Bakış

NDK'daki Clang derleyicisi sadece minimum yapılandırmayla kullanılabilir hedef ortamınızı belirlemeniz için gereklidir.

Doğru mimariyi derlediğinizden emin olmak için Clang çağrılırken -target ile hedefleyin. Örneğin, 64 bit için derlemek minSdkVersion/21 olan ARM Android için aşağıdakileri yapın:

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

Alternatif olarak, Clang için hedef önekli giriş noktaları vardır. Bunlar, NDK sürümüne bağlı olarak clang'a yönlendiren sembolik bağlantılar veya komut dosyaları ve ana işletim sistemiyle uyumlu olmasını sağlayın. Clang'i doğrudan --target ile çağırmak daha güvenilir olacaktır. budur. Bazen bağımsız değişken yönlendirme hatalar var. Windows'da, yönlendirme için gereken ek CreateProcess gerçek derleyiciye kopyalamanızda da fark edilebilir geliştirme hızını olumsuz etkiler.

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

Her iki durumda da, $NDK yerine NDK yolunu, $HOST_TAG alanını da bu yol ile değiştirin aşağıdaki tabloya göre indirdiğiniz NDK:

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

Buradaki önek veya hedef bağımsız değişkeni biçimi, minSdkVersion ifadesini belirten sonek. Bu sonek yalnızca clang/clang++; binutils araçları (ar ve strip gibi) bir sonek minSdkVersion ürününden etkilenmediği için. Android'in desteklediği cihazlar hedef üçlü düzeyi aşağıdaki gibidir:

ABI Triple
ermeabi-v7a armv7a-linux-androideabi
kol64-v8a aarch64-linux-android
x86 i686-linux-android
x86-64 x86_64-linux-android

Birçok projenin için derleme komut dosyalarında GCC tarzı çapraz derleyiciler gerekir. derleyici yalnızca bir işletim sistemi/mimari kombinasyonunu hedeflediğinden çalışmayabilir -target temiz bir şekilde. Bu gibi durumlarda, genellikle -target bağımsız değişkenini derleyici tanımının bir parçası olarak kabul eder (ör. CC="clang -target aarch64-linux-android21). Kullandığınız derleme sisteminin formu kullanamıyorsanız üç önekli Clang ikili programlarını kullanın.

Otomatik konferans

Autoconf projeleri, ortamla kullanılacak araç zincirini belirtmenize olanak tanır değişkenlerine karşılık gelir. Örneğin, aşağıda Android için libpng oluşturma işleminin nasıl yapılacağı gösterilmektedir Linux'ta, minSdkVersion API düzeyi 21 ile x86-64.

# 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

Bu örnekte seçilen araçlar NDK r22 ve daha yeni sürümler için geçerlidir. Daha eski NDK'lar farklı araçlar gerektirebilir.

Otomatik yapılandırma olmayan reklam projeleri

Bazı makefile projeleri, aynı değişkenleri geçersiz kılarak çapraz derlemeye olanak tanır aynı olacaktır. Aşağıda örnek olarak, Android x86-64 için minSdkVersion olan 21 ile libbzip2 derlemek üzere.

# 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

Bu örnekte seçilen araçlar NDK r22 ve daha yeni sürümler için geçerlidir. Daha eski NDK'lar farklı araçlar gerektirebilir.