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 Anda membuat kode untuk arsitektur yang tepat, teruskan target yang sesuai dengan -target saat memanggil Clang, atau panggil Clang berawalan target. Misalnya, untuk mengompilasi Android ARM 64 bit dengan minSdkVersion 21, salah satu dari yang berikut ini dapat digunakan dan Anda dapat memilih opsi yang menurut Anda paling praktis:

$ $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

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 hal ini, Anda biasanya dapat menyertakan argumen -target sebagai bagian dari definisi compiler (misalnya, CC="clang -target aarch64-linux-android21), atau menggunakan biner Clang berawalan triple.

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/$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

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/$TARGET$API-clang \
    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.