ใช้ NDK กับระบบบิลด์อื่นๆ

NDK มีการสนับสนุนอย่างเป็นทางการสำหรับ ndk-build และ CMake ผู้ใช้ส่วนใหญ่ควร ให้ดูหนึ่งในคู่มือเหล่านั้นในการสร้างโค้ดแอปพลิเคชัน วัตถุประสงค์ของ เอกสารนี้จะอธิบายวิธีสร้างโค้ดที่มีอยู่ซึ่งใช้บิลด์อื่น ระบบต่างๆ ซึ่งมักเกิดกับทรัพยากร Dependency ของบุคคลที่สาม เฉพาะสำหรับ Android เช่น OpenSSL และ libbzip2

ผู้ดูแลระบบที่ต้องการเพิ่มการรองรับ NDK ดั้งเดิมลงในบิลด์ ระบบควรอ่านคู่มือการบำรุงรักษาระบบแทน

ภาพรวม

คอมไพเลอร์ Clang ใน NDK สามารถใช้งานได้โดยมีการกำหนดค่าเพียงเล็กน้อย ที่จำเป็นต่อการกำหนดสภาพแวดล้อมเป้าหมาย

เพื่อให้แน่ใจว่าคุณสร้าง สำหรับสถาปัตยกรรมที่ถูกต้อง ให้ส่ง กำหนดเป้าหมายด้วย -target เมื่อเรียกใช้ Clang เช่น หากต้องการคอมไพล์แบบ 64 บิต เปิดระบบ Android ที่มี minSdkVersion เป็น 21 ให้ทำตามขั้นตอนต่อไปนี้

$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/clang++ \
    --target aarch64-linux-android21 foo.cpp

อีกทางเลือกหนึ่งคือ จุดแรกเข้าที่มีคำนำหน้าเป้าหมายสำหรับ Clang ซึ่งอาจเป็น ลิงก์สัญลักษณ์หรือสคริปต์ที่ส่งต่อไปยัง Clang ทั้งนี้ขึ้นอยู่กับการเผยแพร่ NDK และระบบปฏิบัติการของโฮสต์ การเรียกใช้ Clang ด้วย --target โดยตรงจะมีความน่าเชื่อถือมากกว่า เนื่องจาก ซึ่งเป็นเวิร์กโฟลว์ที่มีการทดสอบมากที่สุด และบางครั้งก็อาจมีการส่งต่ออาร์กิวเมนต์ ข้อบกพร่องในสคริปต์ ใน Windows ต้องมี CreateProcess ส่วนเกินเพื่อส่งต่อ ตั้งแต่สคริปต์ไปจนถึงคอมไพเลอร์จริง จะส่งผลเสียต่อความเร็วของบิลด์

$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/aarch64-linux-android21-clang++ \
    foo.cpp

ในทั้ง 2 กรณี ให้แทนที่ $NDK ด้วยเส้นทางไปยัง NDK และ $HOST_TAG ให้ตรงกัน NDK ที่คุณดาวน์โหลดตามตารางต่อไปนี้

ตัวแปรระบบปฏิบัติการ NDK แท็กโฮสต์
macOS darwin-x86_64
Linux linux-x86_64
Windows 64 บิต windows-x86_64

รูปแบบของคำนำหน้าหรืออาร์กิวเมนต์เป้าหมายในที่นี้คือ 3 เป้าหมายที่มีค่า ส่วนต่อท้ายซึ่งแสดงถึง minSdkVersion คำต่อท้ายนี้ใช้ได้กับ clang/clang++; เครื่องมือ Binutils (เช่น ar และ strip) ไม่จำเป็นต้องมี ต่อท้ายเนื่องจากไม่ได้รับผลกระทบจาก minSdkVersion รองรับ Android ดังนี้

ABI ทริปเปิล
Armeabi-V7a armv7a-linux-androideabi
ARM64-V8a aarch64-linux-android
X86 i686-linux-android
X86-64 x86_64-linux-android

ของหลายโปรเจ็กต์ สคริปต์บิลด์จะคาดหวังการรวบรวมข้ามคอมไพเลอร์รูปแบบ GCC ซึ่งแต่ละรายการ คอมไพเลอร์กำหนดเป้าหมายชุดค่าผสมของระบบปฏิบัติการ/สถาปัตยกรรมเพียง 1 รายการเท่านั้น ดังนั้นจึงอาจไม่สามารถจัดการ -target สะอาด ในกรณีเช่นนี้ โดยทั่วไปคุณสามารถใส่ -target เป็นส่วนหนึ่งของคำจำกัดความของคอมไพเลอร์ (เช่น CC="clang -target aarch64-linux-android21) ในบางกรณีซึ่งระบบบิลด์ที่คุณใช้อยู่ ไม่สามารถใช้แบบฟอร์มนั้นได้ ให้ใช้ไบนารีของ Clang ที่มีคำนำหน้า 3 ตัว

การกำหนดค่าอัตโนมัติ

โปรเจ็กต์ Autoconf ช่วยให้คุณระบุ Toolchain ที่จะใช้กับสภาพแวดล้อมได้ ตัวแปร ตัวอย่างต่อไปนี้แสดงวิธีสร้าง libpng สำหรับ Android x86-64 ที่มี minSdkVersion ของ API ระดับ 21 ใน 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

เครื่องมือที่เลือกในตัวอย่างนี้ถูกต้องสำหรับ NDK r22 และใหม่กว่า NDK ที่เก่ากว่า อาจต้องใช้เครื่องมือที่แตกต่างกัน

โปรเจ็กต์สร้างที่ไม่ใช่การกำหนดค่าอัตโนมัติ

โปรเจ็กต์สร้างไฟล์บางโปรเจ็กต์อนุญาตให้มีการคอมไพล์แบบข้ามระบบโดยการลบล้างตัวแปรเดียวกัน ที่คุณทำกับโปรเจ็กต์ autoconf ตัวอย่างด้านล่างแสดงวิธีการ เพื่อสร้าง libbzip2 สำหรับ Android x86-64 ที่มี 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

เครื่องมือที่เลือกในตัวอย่างนี้ถูกต้องสำหรับ NDK r22 และใหม่กว่า NDK ที่เก่ากว่า อาจต้องใช้เครื่องมือที่แตกต่างกัน