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.