Menggunakan NDK dengan sistem build lain

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.