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-nya sebaiknya membaca Panduan Pengelola Sistem Build.

Ringkasan

Mulai dari NDK r19, toolchain yang diinstal secara default bersama NDK sudah dapat digunakan. Skrip make_standalone_toolchain.py tidak lagi diperlukan untuk berinteraksi dengan sistem build arbitrer.

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 membuat kompilasi bagi Android ARM 64 bit dengan minSdkVersion 21, salah satu dari berikut ini dapat digunakan dan Anda bisa memilih opsi yang menurut Anda paling praktis:

$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/clang++ \
        -target aarch64-linux-android21 foo.cpp
    
$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/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 32 bit windows
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 semacam ini, sebaiknya gunakan biner Clang berawalan triple.

Autoconf

Project Autoconf memungkinkan Anda menentukan toolchain yang akan digunakan dengan variabel lingkungan. Misalnya, contoh berikut ini menunjukkan cara membuat libpng untuk Android x86-64 dengan minSdkVersion API level 21, di Linux.

# Check out the source.
    git clone https://github.com/glennrp/libpng
    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/$TARGET-ar
    export AS=$TOOLCHAIN/bin/$TARGET-as
    export CC=$TOOLCHAIN/bin/$TARGET$API-clang
    export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
    export LD=$TOOLCHAIN/bin/$TARGET-ld
    export RANLIB=$TOOLCHAIN/bin/$TARGET-ranlib
    export STRIP=$TOOLCHAIN/bin/$TARGET-strip
    ./configure --host $TARGET
    make
    

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 ini menunjukkan cara mem-buildlibbzip2 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/$TARGET-ar \
        RANLIB=$TOOLCHAIN/bin/$TARGET-ranlib \
        bzip2