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 ที่เก่ากว่า อาจต้องใช้เครื่องมือที่แตกต่างกัน