NDK ini berisi dukungan resmi untuk ndk-build dan CMake. Sebagian besar pengguna perlu merujuk ke salah satu panduan tersebut untuk mem-build kode aplikasi. Tujuan dari dokumen ini adalah untuk menjelaskan cara mem-build kode yang sudah ada yang menggunakan sistem build lain. Hal ini sering terjadi pada dependensi pihak ketiga yang tidak khusus Android, seperti OpenSSL dan libbzip2.
Pengelola sistem build yang ingin menambahkan dukungan NDK native ke sistem build sebaiknya membaca Panduan Pengelola Sistem Build.
Ringkasan
Compiler Clang di NDK hanya dapat digunakan dengan konfigurasi minimal yang diperlukan untuk menentukan lingkungan target Anda.
Untuk memastikan bahwa Anda membangun untuk arsitektur yang benar, teruskan
target dengan -target
saat memanggil Clang. Misalnya, untuk
mengkompilasi 64-bit,
ARM Android dengan minSdkVersion
21, lakukan hal berikut:
$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/clang++ \
--target aarch64-linux-android21 foo.cpp
Atau, ada titik entri berawalan target untuk Clang. Mungkin berupa
symlink atau skrip yang meneruskan ke clang, tergantung pada rilis NDK
dan host OS. Memanggil Clang secara langsung dengan --target
akan lebih dapat diandalkan, karena
yang merupakan alur kerja yang paling teruji, dan terkadang ada penerusan argumen
{i>bug<i} dalam skrip. Di Windows, CreateProcess
tambahan yang diperlukan untuk meneruskan
dari skrip ke compiler asli berpotensi
untuk memiliki tampilan yang terlihat
dampak negatif terhadap kecepatan build.
$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/aarch64-linux-android21-clang++ \
foo.cpp
Dalam kedua kasus tersebut, ganti $NDK
dengan jalur ke NDK dan $HOST_TAG
agar cocok dengan NDK yang sudah didownload, dengan mengacu pada tabel berikut:
Varian OS NDK | Tag Host |
---|---|
macOS | darwin-x86_64 |
Linux | linux-x86_64 |
Windows 64 bit | windows-x86_64 |
Format argumen target atau awalan di sini adalah triple target dengan akhiran yang menunjukkan minSdkVersion
. Akhiran ini hanya digunakan dengan clang/clang++; alat binutils (seperti ar
dan strip
) tidak memerlukan akhiran karena tidak terpengaruh oleh minSdkVersion
. Triple target yang didukung Android meliputi:
ABI | Triple |
---|---|
armeabi-v7a | armv7a-linux-androideabi |
arm64-v8a | aarch64-linux-android |
x86 | i686-linux-android |
x86-64 | x86_64-linux-android |
Banyak skrip build project mengharapkan kompilasi silang bergaya GCC di mana setiap compiler hanya menargetkan satu kombinasi OS/arsitektur, sehingga mungkin tidak menangani -target
dengan rapi. Dalam kasus ini, Anda biasanya dapat menyertakan -target
sebagai bagian dari definisi compiler (mis. CC="clang -target
aarch64-linux-android21
). Dalam kasus yang jarang terjadi, sistem
pengembangan yang Anda gunakan
tidak dapat menggunakan formulir tersebut, gunakan biner Clang berawalan tiga.
Autoconf
Project autoconf memungkinkan Anda menentukan toolchain yang akan digunakan dengan variabel
lingkungan. Misalnya, contoh berikut menunjukkan cara mem-build libpng
untuk Android
x86-64 dengan minSdkVersion
API level 21, di Linux.
# 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
Alat yang dipilih dalam contoh ini sudah benar untuk NDK r22 dan yang lebih baru. NDK lama mungkin memerlukan alat yang berbeda.
Project make non-autoconf
Beberapa project makefile mendukung kompilasi silang dengan mengganti variabel yang sama dengan yang Anda gunakan pada project autoconf. Misalnya, contoh berikut menunjukkan cara
mem-build libbzip2
untuk Android x86-64 dengan minSdkVersion
21.
# 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
Alat yang dipilih dalam contoh ini sudah benar untuk NDK r22 dan yang lebih baru. NDK lama mungkin memerlukan alat yang berbeda.