หน้านี้อธิบายไวยากรณ์ของไฟล์บิลด์ Android.mk
ที่ใช้โดย
ndk-build
ภาพรวม
ไฟล์ Android.mk
อยู่ในไดเรกทอรีย่อยของไดเรกทอรี jni/
ของโปรเจ็กต์ และอธิบายแหล่งที่มาและไลบรารีที่ใช้ร่วมกันให้กับระบบบิลด์
นี่เป็นส่วนย่อยของไฟล์ GNU ขนาดเล็กที่ระบบบิลด์จะแยกวิเคราะห์เพียงครั้งเดียวหรือ
และอีกมากมาย ไฟล์ Android.mk
มีประโยชน์ในการกำหนดการตั้งค่าทั่วทั้งโปรเจ็กต์ที่ Application.mk
, ระบบบิลด์ และตัวแปรสภาพแวดล้อมไม่ได้กำหนดไว้ นอกจากนี้ยังลบล้างการตั้งค่าของทั้งโปรเจ็กต์สำหรับโมดูลที่เจาะจงได้ด้วย
ไวยากรณ์ของ Android.mk
ช่วยให้คุณจัดกลุ่มแหล่งที่มาเป็นโมดูลได้
โมดูลอาจเป็นไลบรารีแบบคงที่ ไลบรารีที่ใช้ร่วมกัน หรือสแตนด์อโลน
ไฟล์ปฏิบัติการ คุณสามารถกำหนดอย่างน้อย 1 โมดูลในไฟล์ Android.mk
แต่ละไฟล์ และ
คุณสามารถใช้ไฟล์ต้นฉบับเดียวกันในหลายโมดูลได้ ระบบบิลด์จะวางไลบรารีที่ใช้ร่วมกันไว้ในแพ็กเกจแอปพลิเคชันเท่านั้น นอกจากนี้ ไลบรารีแบบคงที่ยังสร้างไลบรารีที่ใช้ร่วมกันได้
นอกจากการแพ็กเกจไลบรารีแล้ว ระบบบิลด์ยังจัดการรายละเอียดอื่นๆ ให้คุณด้วย เช่น คุณไม่จำเป็นต้องแสดงไฟล์ส่วนหัวหรือเนื้อหาที่อาจไม่เหมาะสม
ทรัพยากร Dependency ระหว่างไฟล์ที่สร้างขึ้นในไฟล์ Android.mk
บิลด์ NDK
ระบบจะคำนวณความสัมพันธ์เหล่านี้ให้คุณโดยอัตโนมัติ ด้วยเหตุนี้คุณ
จะได้รับประโยชน์จากการรองรับแพลตฟอร์ม/เชนเครื่องมือใหม่ในอนาคต NDK
ออกใหม่โดยไม่ต้องแตะไฟล์ Android.mk
ไวยากรณ์ของไฟล์นี้ใกล้เคียงกับที่ใช้ในไฟล์ Android.mk
มาก
แจกจ่ายด้วยโครงการโอเพนซอร์ส Android เต็มรูปแบบ ขณะที่ระบบบิลด์
ในการใช้งานจริงนั้นแตกต่างกัน ความคล้ายคลึงกันของทั้ง 2 แบบคือความตั้งใจ
การตัดสินใจออกแบบที่มุ่งให้นักพัฒนาแอปพลิเคชันสามารถนำ
ซอร์สโค้ดสำหรับไลบรารีภายนอก
ข้อมูลเบื้องต้น
ก่อนดูรายละเอียดของไวยากรณ์ คุณควรเริ่มต้นด้วยการทำความเข้าใจข้อมูลพื้นฐานเกี่ยวกับสิ่งที่ไฟล์ Android.mk
มี ส่วนนี้ใช้ไฟล์ Android.mk
ในตัวอย่าง Hello-JNI เพื่ออธิบายบทบาทของบรรทัดแต่ละบรรทัดในไฟล์
ไฟล์ Android.mk
ต้องเริ่มต้นด้วยการกําหนดตัวแปร LOCAL_PATH
ดังนี้
LOCAL_PATH := $(call my-dir)
ตัวแปรนี้ระบุตำแหน่งของไฟล์ต้นฉบับในการพัฒนา
ต้นไม้ ในที่นี้ ฟังก์ชันมาโคร my-dir
ซึ่งมาจากระบบบิลด์ จะส่งคืน
เส้นทางของไดเรกทอรีปัจจุบัน (ไดเรกทอรีที่มี Android.mk
โดยตรง)
บรรทัดถัดไปจะประกาศตัวแปร CLEAR_VARS
ซึ่งเป็นค่าของระบบบิลด์
ที่มีให้
include $(CLEAR_VARS)
ตัวแปร CLEAR_VARS
ชี้ไปที่ GNU Makefile พิเศษที่ช่วยล้างหลายๆ
LOCAL_XXX
ตัวแปรให้คุณ เช่น LOCAL_MODULE
, LOCAL_SRC_FILES
และ
LOCAL_STATIC_LIBRARIES
โปรดทราบว่าการดำเนินการนี้จะไม่ล้าง LOCAL_PATH
ช่วงเวลานี้
จะต้องเก็บค่าตัวแปรไว้เนื่องจากระบบแยกวิเคราะห์ไฟล์ควบคุมบิลด์ทั้งหมด
ใน GNU สร้างบริบทการดำเนินการที่ตัวแปรทั้งหมดอยู่ส่วนกลาง คุณต้องประกาศตัวแปรนี้ (อีกครั้ง) ก่อนอธิบายแต่ละข้อบังคับ
จากนั้นตัวแปร LOCAL_MODULE
จะจัดเก็บชื่อโมดูลที่คุณต้องการ
งานสร้าง ใช้ตัวแปรนี้ 1 ครั้งต่อโมดูลในแอปพลิเคชัน
LOCAL_MODULE := hello-jni
ชื่อโมดูลแต่ละชื่อต้องไม่ซ้ำกันและต้องไม่มีการเว้นวรรค ระบบบิลด์
เมื่อสร้างไฟล์ไลบรารีที่ใช้ร่วมกันขั้นสุดท้าย ก็จะเพิ่มคอลัมน์
คำนำหน้าและคำต่อท้ายชื่อที่คุณกำหนดให้กับ LOCAL_MODULE
ตัวอย่างเช่น
ตัวอย่างที่ปรากฏด้านบนส่งผลให้เกิดการสร้างห้องสมุดชื่อ
libhello-jni.so
บรรทัดถัดไปจะแจกแจงไฟล์ต้นฉบับ โดยมีการเว้นวรรคคั่นไฟล์หลายรายการ ไฟล์:
LOCAL_SRC_FILES := hello-jni.c
ตัวแปร LOCAL_SRC_FILES
ต้องมีรายการไฟล์ต้นฉบับ C และ/หรือ C++
ในการสร้างเป็นโมดูล
บรรทัดสุดท้ายช่วยให้ระบบเชื่อมโยงทุกอย่างเข้าด้วยกัน
include $(BUILD_SHARED_LIBRARY)
ตัวแปร BUILD_SHARED_LIBRARY
จะชี้ไปยังสคริปต์ GNU Makefile ที่รวบรวมข้อมูลทั้งหมดที่คุณกำหนดไว้ในตัวแปร LOCAL_XXX
นับตั้งแต่ include
ล่าสุด สคริปต์นี้จะกำหนดสิ่งที่ต้องสร้างและวิธีสร้าง
มีตัวอย่างที่ซับซ้อนมากขึ้นในไดเรกทอรีตัวอย่าง ซึ่งมีไฟล์ Android.mk
ที่มีความคิดเห็นให้ดู นอกจากนี้ ตัวอย่าง: Native-activity
จะให้คำอธิบายโดยละเอียดเกี่ยวกับไฟล์ Android.mk
ของตัวอย่างดังกล่าว สุดท้าย
ตัวแปรและมาโครให้ข้อมูลเพิ่มเติมเกี่ยวกับตัวแปรจาก
ตัวแปรและมาโคร
ระบบบิลด์มีตัวแปรที่เป็นไปได้หลายรายการสําหรับใช้ในไฟล์ Android.mk
ตัวแปรเหล่านี้จำนวนมากมาพร้อมกับค่าที่กำหนดไว้ล่วงหน้า ส่วนรายการอื่นๆ คุณจะกำหนดเองได้
นอกจากตัวแปรเหล่านี้แล้ว คุณยังกําหนดตัวแปรของคุณเองแบบไม่จํากัดได้ด้วย หากใช้วิธีนี้ โปรดทราบว่าระบบบิลด์ NDK สงวนชื่อตัวแปรต่อไปนี้ไว้
- ชื่อที่ขึ้นต้นด้วย
LOCAL_
เช่นLOCAL_MODULE
- ชื่อที่ขึ้นต้นด้วย
PRIVATE_
,NDK_
หรือAPP
ระบบบิลด์จะใช้ไฟล์เหล่านี้ภายใน - ชื่อตัวพิมพ์เล็ก เช่น
my-dir
ระบบบิลด์จะใช้สิ่งเหล่านี้ภายใน
หากต้องการกําหนดตัวแปรที่สะดวกของคุณเองในไฟล์ Android.mk
เราขอแนะนําให้ใส่ MY_
ไว้หน้าชื่อตัวแปร
ตัวแปรรวมที่กำหนดโดย NDK
ส่วนนี้จะกล่าวถึงตัวแปร GNU Make ที่ระบบบิลด์กำหนดไว้ก่อนแยกวิเคราะห์ไฟล์ Android.mk
ในบางกรณี NDK อาจแยกวิเคราะห์ไฟล์ Android.mk
หลายครั้งโดยใช้คําจํากัดความที่แตกต่างกันสําหรับตัวแปรเหล่านี้บางรายการในแต่ละครั้ง
CLEAR_VARS
ตัวแปรนี้ชี้ไปยังสคริปต์บิลด์ที่ยกเลิกการกําหนดLOCAL_XXX
ตัวแปรเกือบทั้งหมดที่แสดงในส่วน "ตัวแปรที่นักพัฒนาแอปกําหนด" ด้านล่าง ใช้ร่างคำตอบนี้
ที่จะรวมสคริปต์นี้ก่อนที่จะอธิบายโมดูลใหม่ ไวยากรณ์ของ
โดยใช้สิ่งนี้
include $(CLEAR_VARS)
BUILD_EXECUTABLE
ตัวแปรนี้ชี้ไปยังสคริปต์บิลด์ที่รวบรวมข้อมูลทั้งหมดเกี่ยวกับ
โมดูลที่คุณระบุไว้ในตัวแปร LOCAL_XXX
รวมทั้งกำหนดวิธีการ
สร้างปฏิบัติการเป้าหมายจากแหล่งที่มาที่คุณระบุ โปรดทราบว่าการใช้สิ่งนี้
คุณต้องกำหนดค่าให้กับ LOCAL_MODULE
และ
LOCAL_SRC_FILES
เป็นอย่างน้อย (ดูข้อมูลเพิ่มเติมเกี่ยวกับตัวแปรเหล่านี้ได้ที่
ตัวแปรคำอธิบายโมดูล)
ไวยากรณ์สําหรับการใช้ตัวแปรนี้มีดังนี้
include $(BUILD_EXECUTABLE)
คลังที่ใช้ร่วมกัน
ตัวแปรนี้ชี้ไปยังสคริปต์บิลด์ที่รวบรวมข้อมูลทั้งหมดเกี่ยวกับ
โมดูลที่คุณระบุไว้ในตัวแปร LOCAL_XXX
รวมทั้งกำหนดวิธีการ
สร้างไลบรารีที่ใช้ร่วมกันเป้าหมายจากแหล่งที่มาที่คุณแสดงรายการไว้ โปรดทราบว่าการใช้สิ่งนี้
คุณต้องกำหนดค่าให้กับ LOCAL_MODULE
และ
LOCAL_SRC_FILES
เป็นอย่างน้อย (ดูข้อมูลเพิ่มเติมเกี่ยวกับตัวแปรเหล่านี้ได้ที่
ตัวแปรคำอธิบายโมดูล)
ไวยากรณ์สําหรับการใช้ตัวแปรนี้มีดังนี้
include $(BUILD_SHARED_LIBRARY)
ตัวแปรไลบรารีที่ใช้ร่วมกันทําให้ระบบบิลด์สร้างไฟล์ไลบรารีที่มีนามสกุล .so
คลังสถิติสถิติ
ตัวแปรของ BUILD_SHARED_LIBRARY
ที่ใช้สร้างไลบรารีแบบคงที่ ระบบบิลด์จะไม่คัดลอกไลบรารีแบบคงที่ลงในโปรเจ็กต์/แพ็กเกจ แต่จะใช้ไลบรารีดังกล่าวเพื่อสร้างไลบรารีที่ใช้ร่วมกันได้ (ดู LOCAL_STATIC_LIBRARIES
และ LOCAL_WHOLE_STATIC_LIBRARIES
ด้านล่าง) ไวยากรณ์สำหรับการใช้ตัวแปรนี้คือ
include $(BUILD_STATIC_LIBRARY)
ตัวแปรไลบรารีแบบคงที่จะทำให้ระบบสร้างไลบรารีที่มี
ส่วนขยาย .a
คลังที่สร้างไว้ล่วงหน้า
ชี้ไปที่สคริปต์บิลด์ที่ใช้ระบุไลบรารีที่ใช้ร่วมกันที่สร้างไว้ล่วงหน้า เลิกชอบ
ในกรณีของ BUILD_SHARED_LIBRARY
และ BUILD_STATIC_LIBRARY
นี่คือค่าของ
LOCAL_SRC_FILES
ไม่สามารถเป็นไฟล์ต้นฉบับ แต่ต้องเป็นเส้นทางเดียวไปยังไลบรารีที่ใช้ร่วมกันที่สร้างไว้ล่วงหน้า เช่น foo/libfoo.so
ไวยากรณ์สำหรับการใช้ตัวแปรนี้มีดังนี้
include $(PREBUILT_SHARED_LIBRARY)
นอกจากนี้ คุณยังสามารถอ้างอิงไลบรารีที่สร้างไว้ล่วงหน้าในอีกโมดูลหนึ่งได้โดยใช้
ตัวแปร LOCAL_PREBUILTS
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการใช้รายการที่สร้างไว้ล่วงหน้า โปรดดูที่
ใช้ไลบรารีที่สร้างไว้ล่วงหน้า
ไลบรารีสถิติเบื้องต้น
เหมือนกับ PREBUILT_SHARED_LIBRARY
แต่สำหรับไลบรารีแบบคงที่ที่สร้างไว้ล่วงหน้า ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้รายการที่สร้างไว้ล่วงหน้าได้ที่ใช้ไลบรารีที่สร้างไว้ล่วงหน้า
ตัวแปรข้อมูลเป้าหมาย
ระบบบิลด์จะแยกวิเคราะห์ Android.mk
1 ครั้งต่อ ABI ที่ระบุโดย APP_ABI
ซึ่งมักกำหนดไว้ในไฟล์ Application.mk
หาก APP_ABI
มีค่า all
ระบบบิลด์จะแยกวิเคราะห์ Android.mk
1 ครั้งต่อ ABI ส่วน NDK
รองรับ ส่วนนี้จะอธิบายตัวแปรที่ระบบบิลด์กำหนดทุกครั้งที่แยกวิเคราะห์ Android.mk
TARGET_ARCH
ตระกูล CPU ที่ระบบบิลด์กําลังกําหนดเป้าหมายขณะแยกวิเคราะห์Android.mk
ไฟล์นี้ ตัวแปรนี้จะเป็นหนึ่งใน arm
, arm64
, x86
หรือ x86_64
TARGET_PLATFORM
หมายเลขระดับ API ของ Android ที่ระบบบิลด์กําหนดเป้าหมายขณะแยกวิเคราะห์ไฟล์นี้
Android.mk
ตัวอย่างเช่น อิมเมจระบบ Android 5.1 สอดคล้องกับ
API ของ Android ระดับ 22: android-22
ดูรายการชื่อแพลตฟอร์มและภาพระบบ Android ที่เกี่ยวข้องทั้งหมดได้ที่ Native API
ตัวอย่างต่อไปนี้แสดงไวยากรณ์สำหรับการใช้ตัวแปรนี้:
ifeq ($(TARGET_PLATFORM),android-22)
# ... do something ...
endif
TARGET_ARCH_ABI
ABI ที่ระบบบิลด์กําลังกําหนดเป้าหมายขณะแยกวิเคราะห์ไฟล์ Android.mk
นี้
ตารางที่ 1 แสดงการตั้งค่า ABI ที่ใช้สำหรับ CPU และสถาปัตยกรรมที่รองรับแต่ละรายการ
ตารางที่ 1 การตั้งค่า ABI สำหรับ CPU และสถาปัตยกรรมที่ต่างกัน
CPU และสถาปัตยกรรม | การเกริ่นนำ |
---|---|
ARMv7 | armeabi-v7a |
ARMv8 AArch64 | arm64-v8a |
I686 | x86 |
X86-64 | x86_64 |
ตัวอย่างต่อไปนี้แสดงวิธีตรวจสอบว่า ARMv8 AArch64 เป็นชุดค่าผสม CPU และ ABI เป้าหมายหรือไม่
ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
# ... do something ...
endif
ดูรายละเอียดเพิ่มเติมเกี่ยวกับ ABI ของสถาปัตยกรรมและปัญหาความเข้ากันได้ที่เกี่ยวข้อง ดู ABI ของ Android
ABI เป้าหมายใหม่ในอนาคตจะมีค่าแตกต่างกัน
TARGET_ABI
การต่อระดับ API ของ Android และ ABI เป้าหมาย มีประโยชน์อย่างยิ่ง เมื่อต้องการทดสอบกับอิมเมจระบบเป้าหมายที่เฉพาะเจาะจงสำหรับอุปกรณ์จริง เช่น หากต้องการตรวจสอบอุปกรณ์ ARM 64 บิตที่ทำงานใน Android API ระดับ 22 ให้ทำดังนี้
ifeq ($(TARGET_ABI),android-22-arm64-v8a)
# ... do something ...
endif
ตัวแปรคำอธิบายโมดูล
ตัวแปรในส่วนนี้จะอธิบายโมดูลของคุณให้กับระบบบิลด์ คำอธิบายแต่ละข้อของข้อบังคับควรเป็นไปตามขั้นตอนพื้นฐานต่อไปนี้
- เริ่มต้นหรือยกเลิกการกำหนดตัวแปรที่เชื่อมโยงกับโมดูล โดยใช้
ตัวแปร
CLEAR_VARS
- กําหนดค่าให้กับตัวแปรที่ใช้อธิบายข้อบังคับ
- ตั้งค่าระบบการสร้าง NDK ให้ใช้สคริปต์การสร้างที่เหมาะสมสําหรับโมดูลโดยใช้ตัวแปร
BUILD_XXX
เส้นทาง LOCAL_PATH
ตัวแปรนี้ใช้เพื่อระบุเส้นทางของไฟล์ปัจจุบัน คุณต้องกำหนดค่าที่จุดเริ่มต้นของไฟล์ Android.mk
ตัวอย่างต่อไปนี้จะแสดงวิธีการ
ดังนั้น:
LOCAL_PATH := $(call my-dir)
สคริปต์ที่ CLEAR_VARS
ชี้ถึงไม่ได้ล้างตัวแปรนี้ ดังนั้น
คุณต้องกำหนดเพียงครั้งเดียวเท่านั้น ถึงแม้ว่าไฟล์ Android.mk
อธิบายโมดูลต่างๆ
โมดูลในพื้นที่
ตัวแปรนี้จัดเก็บชื่อโมดูลของคุณ โดยต้องไม่ซ้ำกับชื่อโมดูลทั้งหมดและต้องไม่มีการเว้นวรรค คุณต้องกำหนดก่อนรวมสคริปต์ (นอกเหนือจากสคริปต์สำหรับ CLEAR_VARS
) คุณไม่จําเป็นต้องใส่คำนำหน้า lib
หรือนามสกุลไฟล์ .so
หรือ .a
เนื่องจากระบบบิลด์จะทำการเปลี่ยนแปลงเหล่านี้โดยอัตโนมัติ ตลอดทั้งไฟล์ Android.mk
และ Application.mk
ให้อ้างอิงโมดูลด้วยชื่อเดิม ตัวอย่างเช่น URL ต่อไปนี้
ผลลัพธ์บรรทัดในการสร้างโมดูลไลบรารีที่ใช้ร่วมกันชื่อ libfoo.so
:
LOCAL_MODULE := "foo"
หากต้องการให้โมดูลที่สร้างขึ้นมีชื่ออื่นนอกเหนือจาก lib
+ ค่าของ LOCAL_MODULE
คุณสามารถใช้ตัวแปร LOCAL_MODULE_FILENAME
เพื่อตั้งชื่อโมดูลที่สร้างขึ้นเองแทนได้
LOCAL_MODULE_FILENAME
ตัวแปรที่ไม่บังคับนี้ทำให้คุณสามารถลบล้างชื่อที่ระบบบิลด์
ใช้ค่าเริ่มต้นสำหรับไฟล์ที่สร้างขึ้นมา ตัวอย่างเช่น หากชื่อ
LOCAL_MODULE
คือ foo
คุณบังคับให้ระบบเรียกไฟล์ที่ระบบสร้างได้
libnewfoo
ตัวอย่างต่อไปนี้แสดงวิธีดำเนินการดังกล่าว
LOCAL_MODULE := foo
LOCAL_MODULE_FILENAME := libnewfoo
สําหรับโมดูลไลบรารีที่ใช้ร่วมกัน ตัวอย่างนี้จะสร้างไฟล์ชื่อ
libnewfoo.so
LOCAL_SRC_FILES
ตัวแปรนี้มีรายการไฟล์ต้นฉบับที่ระบบบิลด์ใช้เพื่อ
สร้างโมดูล แสดงเฉพาะไฟล์ที่ระบบบิลด์ส่งไปยังคอมไพเลอร์จริงๆ เนื่องจากระบบบิลด์จะคํานวณข้อกําหนดที่เกี่ยวข้องโดยอัตโนมัติ โปรดทราบว่าคุณใช้ทั้งเส้นทางไฟล์สัมพัทธ์ (เทียบกับ LOCAL_PATH
) และเส้นทางไฟล์สัมบูรณ์ได้
เราขอแนะนำให้หลีกเลี่ยงเส้นทางไฟล์แบบสัมบูรณ์ เส้นทางสัมพัทธ์จะทำให้ Android.mk
ไฟล์พกพาได้ง่าย
LOCAL_CPP_EXTENSION
คุณสามารถใช้ตัวแปรที่ไม่บังคับนี้เพื่อระบุนามสกุลไฟล์อื่นที่ไม่ใช่ .cpp
สำหรับไฟล์ซอร์ส C++ ตัวอย่างเช่น บรรทัดต่อไปนี้จะเปลี่ยนนามสกุลเป็น .cxx
(การตั้งค่าต้องมีจุด)
LOCAL_CPP_EXTENSION := .cxx
คุณใช้ตัวแปรนี้เพื่อระบุส่วนขยายหลายรายการได้ ตัวอย่างเช่น
LOCAL_CPP_EXTENSION := .cxx .cpp .cc
LOCAL_CPP_FEATURES
คุณสามารถใช้ตัวแปรที่ไม่บังคับนี้เพื่อระบุว่าโค้ดของคุณใช้ฟีเจอร์ C++ ที่เฉพาะเจาะจง ช่วยให้มีการแฟล็กคอมไพเลอร์และ Linker ที่เหมาะสมระหว่างการสร้าง
ขั้นตอนได้ สําหรับไบนารีที่สร้างไว้ล่วงหน้า ตัวแปรนี้จะประกาศฟีเจอร์ที่ไบนารีนั้นใช้ด้วย ซึ่งช่วยให้การลิงก์ขั้นสุดท้ายทํางานได้อย่างถูกต้อง เราขอแนะนําให้คุณใช้ตัวแปรนี้แทนการเปิดใช้ -frtti
และ -fexceptions
ในคําจํากัดความ LOCAL_CPPFLAGS
โดยตรง
การใช้ตัวแปรนี้ช่วยให้ระบบบิลด์ใช้แฟล็กที่เหมาะสมสำหรับ
แต่ละโมดูล การใช้ LOCAL_CPPFLAGS
จะทำให้คอมไพเลอร์ใช้ Flag ที่ระบุทั้งหมดสำหรับโมดูลทั้งหมด โดยไม่คำนึงถึงความต้องการจริง
เช่น เพื่อระบุว่าโค้ดของคุณใช้ RTTI (ข้อมูลประเภทรันไทม์) เขียน:
LOCAL_CPP_FEATURES := rtti
หากต้องการระบุว่าโค้ดของคุณใช้ข้อยกเว้น C++ ให้เขียนดังนี้
LOCAL_CPP_FEATURES := exceptions
นอกจากนี้ คุณยังระบุค่าหลายค่าสําหรับตัวแปรนี้ได้อีกด้วย เช่น
LOCAL_CPP_FEATURES := rtti features
ลำดับที่คุณอธิบายค่านั้นไม่สำคัญ
Local_C_INCLUDES
คุณสามารถใช้ตัวแปรที่ไม่บังคับนี้เพื่อระบุรายการเส้นทางที่สัมพันธ์กับ
ไดเรกทอรี root
ของ NDK เพื่อเพิ่มไปยังเส้นทางการค้นหาเมื่อรวบรวมข้อมูลทั้งหมด
แหล่งที่มา (C, C++ และ Assembly) เช่น
LOCAL_C_INCLUDES := sources/foo
หรือแม้กระทั่ง:
LOCAL_C_INCLUDES := $(LOCAL_PATH)/<subdirectory>/foo
กำหนดตัวแปรนี้ก่อนตั้งค่าแฟล็กการรวมที่เกี่ยวข้องผ่าน
LOCAL_CFLAGS
หรือ LOCAL_CPPFLAGS
ระบบบิลด์ยังใช้เส้นทาง LOCAL_C_INCLUDES
โดยอัตโนมัติเมื่อเปิดตัวด้วย
การแก้ไขข้อบกพร่องของระบบด้วย ndk-gdb
LOCAL_ASFLAGS
แฟล็กที่จะส่งไปยัง Clang เมื่อสร้างไฟล์ .s
หรือ .S
LOCAL_ASMFLAGS
Flag ที่ส่งไปยัง yasm เมื่อสร้างไฟล์ .asm
LOCAL_CFLAGS
แฟล็กที่จะส่งไปยัง Clang เมื่อสร้าง C, C++ และบางแฟล็ก
ไฟล์ต้นฉบับ Assembly (.s
และ .S
แต่ไม่ใช่ .asm
) ความสามารถในการทำเช่นนี้อาจมีประโยชน์สำหรับการระบุคำจำกัดความของมาโครหรือตัวเลือกการคอมไพล์เพิ่มเติม ใช้
LOCAL_CPPFLAGS
เพื่อระบุ Flag สำหรับ C++ เท่านั้น ใช้ LOCAL_CONLYFLAGS
เพื่อระบุ Flag สำหรับ C เท่านั้น
พยายามอย่าเปลี่ยนระดับการเพิ่มประสิทธิภาพ/การแก้ไขข้อบกพร่องในไฟล์ Android.mk
ระบบบิลด์สามารถจัดการการตั้งค่านี้ให้คุณโดยอัตโนมัติ โดยใช้
ข้อมูลที่เกี่ยวข้องในไฟล์ Application.mk
การทำเช่นนี้จะช่วยให้ระบบบิลด์สร้างไฟล์ข้อมูลที่มีประโยชน์ซึ่งใช้ในการแก้ไขข้อบกพร่องได้
คุณสามารถระบุเส้นทางรวมเพิ่มเติมได้ด้วยการเขียนดังนี้
LOCAL_CFLAGS += -I<path>,
อย่างไรก็ตาม การใช้ LOCAL_C_INCLUDES
เพื่อวัตถุประสงค์นี้จะดีกว่า เนื่องจาก
จึงทำให้สามารถใช้เส้นทางที่มีอยู่สำหรับการแก้ไขข้อบกพร่องของระบบด้วย
ndk-gdb
LOCAL_CONLYFLAGS
แฟล็กซึ่งจะส่งไปยัง Clang เมื่อคอมไพล์ซอร์ส C เลิกชอบ
LOCAL_CFLAGS
, LOCAL_CONLYFLAGS
จะไม่ถูกส่งผ่านไปยัง Clang เมื่อคอมไพล์
C++ หรือแหล่งที่มาของการประกอบ
LOCAL_CPPFLAGS
ชุด Flag คอมไพเลอร์ที่ไม่บังคับซึ่งจะส่งเมื่อสร้างไฟล์ซอร์ส C++ เท่านั้น โดยจะปรากฏหลัง LOCAL_CFLAGS
ใน
บรรทัดคำสั่ง ใช้ LOCAL_CFLAGS
เพื่อระบุ Flag สำหรับทั้ง C และ C++
ไลบรารี LOCAL_STATIC_LIBRARIES
ตัวแปรนี้จัดเก็บรายการโมดูลไลบรารีแบบคงที่ซึ่งฟังก์ชัน ขึ้นอยู่กับ
หากโมดูลปัจจุบันเป็นไลบรารีที่ใช้ร่วมกันหรือไฟล์ปฏิบัติการ ตัวแปรนี้จะบังคับให้ลิงก์ไลบรารีเหล่านี้เข้ากับไบนารีที่ได้
หากโมดูลปัจจุบันเป็นไลบรารีแบบคงที่ ตัวแปรนี้เพียงแค่ระบุว่า โมดูลอื่นๆ ที่ขึ้นอยู่กับโมดูลปัจจุบัน จะขึ้นอยู่กับโมดูล ห้องสมุด
LOCAL_SHARED_LIBRARIES
ตัวแปรนี้คือรายการโมดูลไลบรารีที่ใช้ร่วมกันซึ่งโมดูลนี้ใช้อยู่ ขึ้นอยู่กับรันไทม์ ข้อมูลนี้เป็นสิ่งจำเป็นในเวลาที่ลิงก์ และเพื่อฝัง ข้อมูลที่เกี่ยวข้องในไฟล์ที่สร้างขึ้น
LOCAL_WHOLE_STATIC_LIBRARIES
ตัวแปรนี้เป็นตัวแปรของ LOCAL_STATIC_LIBRARIES
และแสดงว่า Linker ควรถือว่าโมดูลไลบรารีที่เกี่ยวข้องเป็นไฟล์เก็บถาวรทั้งไฟล์ ดูข้อมูลเพิ่มเติมเกี่ยวกับไฟล์เก็บถาวรทั้งหมดได้ที่เอกสารประกอบ GNU ld สำหรับ Flag --whole-archive
ตัวแปรนี้มีประโยชน์เมื่อมีทรัพยากร Dependency แบบวงกลมจากหลายๆ กลุ่ม และไลบรารีแบบคงที่ เมื่อคุณใช้ตัวแปรนี้เพื่อสร้างไลบรารีที่ใช้ร่วมกัน ระบบจะบังคับให้ระบบบิลด์เพิ่มไฟล์ออบเจ็กต์ทั้งหมดจากไลบรารีแบบคงที่ลงในไบนารีสุดท้าย อย่างไรก็ตาม จะไม่เป็นความจริงเมื่อสร้างไฟล์ปฏิบัติการ
LOCAL_LDLIBS
ตัวแปรนี้มีรายการแฟล็ก Linker เพิ่มเติมสำหรับใช้ในอาคาร
ไลบรารีที่ใช้ร่วมกันหรือไฟล์ปฏิบัติการของคุณ ซึ่งจะช่วยให้คุณใช้คำนำหน้า -l
เพื่อส่งชื่อไลบรารีของระบบที่เฉพาะเจาะจงได้ ตัวอย่างเช่น ตัวอย่างต่อไปนี้บอก linker ให้สร้างโมดูลที่ลิงก์กับ /system/lib/libz.so
ในเวลาโหลด
LOCAL_LDLIBS := -lz
ดูรายการไลบรารีระบบที่เปิดเผยซึ่งคุณลิงก์ได้ในรุ่น NDK นี้ได้จากAPI เดิม
LOCAL_LDFLAGS
รายการ Flag อื่นๆ ของ linker สำหรับระบบการบิลด์ที่จะใช้เมื่อสร้างห้องสมุดที่ใช้ร่วมกันหรือไฟล์ปฏิบัติการ เช่น หากต้องการใช้ตัวลิงก์ ld.bfd
ใน
ARM/X86:
LOCAL_LDFLAGS += -fuse-ld=bfd
LOCAL_ALLOW_UNDEFINED_SYMBOLS
โดยค่าเริ่มต้น เมื่อระบบบิลด์พบการอ้างอิงที่ไม่ได้กำหนด ขณะพยายามสร้างการแชร์ ก็จะมีข้อผิดพลาดสัญลักษณ์ที่ไม่ระบุ ช่วงเวลานี้ สามารถช่วยให้พบข้อบกพร่องในซอร์สโค้ด
หากต้องการปิดใช้การตรวจสอบนี้ ให้ตั้งค่าตัวแปรนี้เป็น true
โปรดทราบว่าการตั้งค่านี้อาจทําให้ไลบรารีที่ใช้ร่วมกันโหลดเมื่อรันไทม์
โหมด LOCAL_ARM
โดยค่าเริ่มต้น ระบบบิลด์จะสร้างไบนารีเป้าหมาย ARM ในโหมด thumb ซึ่งแต่ละคำสั่งมีความกว้าง 16 บิตและลิงก์กับไลบรารี STL ในไดเรกทอรี thumb/
การกำหนดตัวแปรนี้เป็น arm
จะบังคับให้ระบบบิลด์
สร้างไฟล์ออบเจ็กต์ของโมดูลในโหมด arm
แบบ 32 บิต ตัวอย่างต่อไปนี้
แสดงวิธีดำเนินการ
LOCAL_ARM_MODE := arm
หรือจะสั่งให้ระบบบิลด์สร้างเฉพาะแหล่งที่มาที่เฉพาะเจาะจงใน arm
ก็ได้
โดยเพิ่ม .arm
ต่อท้ายชื่อไฟล์ต้นฉบับ ตัวอย่างเช่น พารามิเตอร์
ตัวอย่างต่อไปนี้จะบอกระบบบิลด์ให้คอมไพล์ bar.c
ในโหมด ARM เสมอ
แต่เพื่อสร้าง foo.c
ตามค่าของ LOCAL_ARM_MODE
LOCAL_SRC_FILES := foo.c bar.c.arm
LOCAL_ARM_NEON
ตัวแปรนี้สําคัญเฉพาะเมื่อคุณกําหนดเป้าหมาย ABI armeabi-v7a
เท่านั้น ทั้งนี้
อนุญาตให้ใช้คอมไพเลอร์ของ ARM Advanced SIMD (NEON) ใน C และ C++ ได้
รวมถึงคำแนะนำ NEON ในไฟล์ Assembly
โปรดทราบว่า CPU ที่ใช้ ARMv7 บางรุ่นไม่รองรับส่วนขยายชุดคำสั่ง NEON ด้วยเหตุนี้ คุณจึงต้องดำเนินการตรวจหารันไทม์เพื่อให้ใช้โค้ดนี้ได้อย่างปลอดภัยในรันไทม์ ดูข้อมูลเพิ่มเติมได้ที่การรองรับ Neon และฟีเจอร์ของ CPU
คุณสามารถใช้ส่วนต่อท้าย .neon
เพื่อระบุว่าระบบบิลด์
คอมไพล์ไฟล์ต้นฉบับที่มีการรองรับ NEON เท่านั้น ในตัวอย่างต่อไปนี้
ระบบบิลด์คอมไพล์ foo.c
พร้อมการรองรับนิ้วโป้งและนีออน bar.c
พร้อม
รองรับนิ้วหัวแม่มือ และ zoo.c
พร้อมการรองรับ ARM และ NEON:
LOCAL_SRC_FILES = foo.c.neon bar.c zoo.c.arm.neon
หากคุณใช้คำต่อท้ายทั้ง 2 แบบ .arm
ต้องมาก่อน .neon
LOCAL_DISABLE_FORMAT_STRING_CHECKS
โดยค่าเริ่มต้น ระบบบิลด์จะคอมไพล์โค้ดที่มีการปกป้องสตริงรูปแบบ ซึ่งจะบังคับให้คอมไพเลอร์แสดงข้อผิดพลาดหากมีการใช้สตริงรูปแบบที่ไม่ใช่ค่าคงที่ในฟังก์ชันสไตล์ printf
การป้องกันนี้จะเปิดอยู่โดยค่าเริ่มต้น แต่คุณปิดใช้ได้
โดยการตั้งค่าของตัวแปรนี้เป็น true
เราไม่แนะนำให้ดำเนินการดังกล่าวหากไม่มีเหตุผลอันสมควร
LOCAL_EXPORT_CFLAGS
ตัวแปรนี้บันทึกชุดแฟล็กคอมไพเลอร์ C/C++ ที่จะเพิ่มไปยัง LOCAL_CFLAGS
ของโมดูลอื่นๆ ที่ใช้โมดูลนี้ผ่านทาง
LOCAL_STATIC_LIBRARIES
หรือ LOCAL_SHARED_LIBRARIES
ตัวอย่างเช่น ลองพิจารณาโมดูลคู่ต่อไปนี้ foo
และ bar
ซึ่ง
ขึ้นอยู่กับ foo
:
include $(CLEAR_VARS)
LOCAL_MODULE := foo
LOCAL_SRC_FILES := foo/foo.c
LOCAL_EXPORT_CFLAGS := -DFOO=1
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := bar
LOCAL_SRC_FILES := bar.c
LOCAL_CFLAGS := -DBAR=2
LOCAL_STATIC_LIBRARIES := foo
include $(BUILD_SHARED_LIBRARY)
ในส่วนนี้ ระบบบิลด์จะส่งแฟล็ก -DFOO=1
และ -DBAR=2
ไปยังคอมไพเลอร์
เมื่อสร้างbar.c
นอกจากนี้ยังเพิ่ม Flag ที่ส่งออกไว้หน้า Flag ของโมดูลของคุณ
LOCAL_CFLAGS
เพื่อให้คุณลบล้างค่าได้อย่างง่ายดาย
นอกจากนี้ ความสัมพันธ์ระหว่างโมดูลต่างๆ เป็นแบบทรานซิทีฟ: หาก zoo
ขึ้นอยู่กับ
bar
ซึ่งก็ขึ้นอยู่กับ foo
แล้ว zoo
จะรับค่า Flag ทั้งหมดด้วย
ส่งออกจาก foo
สุดท้าย ระบบบิลด์จะไม่ใช้ Flag ที่ส่งออกเมื่อสร้างในเครื่อง (เช่น สร้างโมดูลที่ส่งออก Flag) ดังนั้นในตัวอย่าง
ด้านบน จะไม่ส่ง -DFOO=1
ไปยังคอมไพเลอร์เมื่อสร้าง foo/foo.c
หากต้องการสร้างในเครื่อง ให้ใช้ LOCAL_CFLAGS
แทน
LOCAL_EXPORT_CPPFLAGS
ตัวแปรนี้เหมือนกับ LOCAL_EXPORT_CFLAGS
แต่เป็นสำหรับ Flag ของ C++ เท่านั้น
LOCAL_EXPORT_C_INCLUDES
ตัวแปรนี้เหมือนกับ LOCAL_EXPORT_CFLAGS
แต่สำหรับ C รวมเส้นทาง ซึ่งมีประโยชน์ในกรณีที่ bar.c
ต้องการใส่ส่วนหัวจากข้อบังคับ foo
LOCAL_EXPORT_LDFLAGS
ตัวแปรนี้เหมือนกับ LOCAL_EXPORT_CFLAGS
แต่มีไว้สำหรับแฟล็ก Linker
LOCAL_EXPORT_LDLIBS
ตัวแปรนี้เหมือนกับ LOCAL_EXPORT_CFLAGS
บอกให้ระบบบิลด์
ส่งผ่านชื่อของไลบรารีระบบที่เฉพาะเจาะจงไปยังคอมไพเลอร์ ใส่ -l
ไว้หน้าชื่อของไลบรารีแต่ละรายการที่คุณระบุ
โปรดทราบว่าระบบบิลด์จะเพิ่ม Flag ของ linker ที่นําเข้าไว้ต่อท้ายค่าของตัวแปร LOCAL_LDLIBS
ของโมดูล การดำเนินการนี้เกิดจากวิธีการทํางานของโปรแกรมลิงก์ Unix
โดยทั่วไปแล้ว ตัวแปรนี้จะมีประโยชน์เมื่อโมดูล foo
เป็นไลบรารีแบบคงที่และมีโค้ดที่ขึ้นอยู่กับไลบรารีของระบบ จากนั้นใช้ LOCAL_EXPORT_LDLIBS
เพื่อส่งออกข้อมูลดังกล่าว เช่น
include $(CLEAR_VARS)
LOCAL_MODULE := foo
LOCAL_SRC_FILES := foo/foo.c
LOCAL_EXPORT_LDLIBS := -llog
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := bar
LOCAL_SRC_FILES := bar.c
LOCAL_STATIC_LIBRARIES := foo
include $(BUILD_SHARED_LIBRARY)
ในตัวอย่างนี้ ระบบบิลด์จะใส่ -llog
ไว้ที่ท้ายคำสั่ง Linker
เมื่อสร้าง libbar.so
การทำเช่นนี้จะบอกให้ Linker ทราบว่า เนื่องจาก libbar.so
ขึ้นอยู่กับ foo
และยังขึ้นอยู่กับไลบรารีการบันทึกของระบบด้วย
LOCAL_SHORT_COMMAND
ตั้งค่าตัวแปรนี้เป็น true
เมื่อโมดูลมีแหล่งที่มาจํานวนมาก และ/หรือไลบรารีแบบคงที่หรือแบบแชร์ที่ขึ้นต่อกัน ซึ่งจะบังคับให้ระบบบิลด์ใช้ไวยากรณ์ @
สำหรับไฟล์เก็บถาวรที่มีไฟล์ออบเจ็กต์ระดับกลางหรือไลบรารีการลิงก์
ฟีเจอร์นี้มีประโยชน์ใน Windows เนื่องจากบรรทัดคำสั่งยอมรับอักขระได้สูงสุดเพียง 8,191 ตัว ซึ่งอาจเล็กเกินไปสำหรับโปรเจ็กต์ที่ซับซ้อน นอกจากนี้ ยังส่งผลต่อการคอมไพล์ไฟล์ต้นฉบับแต่ละไฟล์ด้วย โดยวาง Flag คอมไพเลอร์เกือบทั้งหมดไว้ในไฟล์ลิสต์ด้วย
โปรดทราบว่าค่าอื่นที่ไม่ใช่ true
จะเปลี่ยนกลับเป็นลักษณะการทำงานเริ่มต้น คุณ
และยังสามารถกำหนด APP_SHORT_COMMANDS
ในไฟล์ Application.mk
เพื่อบังคับ
ลักษณะนี้ของโมดูลทั้งหมดในโปรเจ็กต์ของคุณ
เราไม่แนะนำให้เปิดใช้ฟีเจอร์นี้โดยค่าเริ่มต้นเนื่องจากจะทำให้การสร้างช้าลง
LOCAL_THIN_ARCHIVE
ตั้งค่าตัวแปรนี้เป็น true
เมื่อสร้างไลบรารีแบบคงที่ การดำเนินการนี้จะ
สร้างที่เก็บถาวรแบบ Thin ซึ่งเป็นไฟล์ไลบรารีที่ไม่มีไฟล์ออบเจ็กต์
แต่ให้ส่งเส้นทางไปยังออบเจ็กต์จริงที่ตามปกติ
มี
ซึ่งมีประโยชน์ในการลดขนาดเอาต์พุตของบิลด์ ข้อเสียก็คือ ไลบรารีดังกล่าวไม่สามารถย้ายไปยังตำแหน่งอื่น (ทุกเส้นทางภายใน เป็นแบบสัมพัทธ์)
ค่าที่ถูกต้องคือ true
, false
หรือว่างเปล่า คุณสามารถกำหนดค่าเริ่มต้นได้ใน
Application.mk
ผ่านตัวแปร APP_THIN_ARCHIVE
LOCAL_FILTER_ASM
กําหนดตัวแปรนี้เป็นคําสั่งเชลล์ที่ระบบบิลด์จะใช้เพื่อกรองไฟล์แอสเซมบลีที่ดึงข้อมูลหรือสร้างจากไฟล์ที่คุณระบุสําหรับ LOCAL_SRC_FILES
การกําหนดตัวแปรนี้ทําให้เกิดเหตุการณ์ต่อไปนี้
- ระบบบิลด์จะสร้างไฟล์การประกอบชั่วคราวจากซอร์ส C หรือ C++ ใดก็ได้ แทนการรวบรวมเป็นไฟล์ออบเจ็กต์
- ระบบบิลด์จะเรียกใช้คำสั่ง Shell ใน
LOCAL_FILTER_ASM
บนอุปกรณ์ใดก็ได้ ไฟล์การประกอบชั่วคราวและไฟล์การประกอบที่ระบุในLOCAL_SRC_FILES
จึงเป็นการสร้างไฟล์การประกอบชั่วคราวอีกไฟล์หนึ่ง - ระบบบิลด์จะคอมไพล์ไฟล์แอสเซมบลีที่กรองแล้วเหล่านี้เป็นไฟล์ออบเจ็กต์
เช่น
LOCAL_SRC_FILES := foo.c bar.S
LOCAL_FILTER_ASM :=
foo.c --1--> $OBJS_DIR/foo.S.original --2--> $OBJS_DIR/foo.S --3--> $OBJS_DIR/foo.o
bar.S --2--> $OBJS_DIR/bar.S --3--> $OBJS_DIR/bar.o
"1" สอดคล้องกับคอมไพเลอร์ "2" สอดคล้องกับตัวกรอง และ "3" สอดคล้องกับแอสเซมเบลอร์ ตัวกรองต้องเป็นคำสั่ง Shell แบบสแตนด์อโลนที่ใช้ชื่อของอินพุต เป็นอาร์กิวเมนต์แรก และชื่อไฟล์เอาต์พุตเป็นอาร์กิวเมนต์ที่สอง เช่น
myasmfilter $OBJS_DIR/foo.S.original $OBJS_DIR/foo.S
myasmfilter bar.S $OBJS_DIR/bar.S
มาโครฟังก์ชันที่ NDK มีให้
ส่วนนี้จะอธิบายมาโครฟังก์ชัน GNU Make ที่ NDK มีให้ ใช้
$(call <function>)
เพื่อประเมินผล กลับมีข้อมูลที่เป็นข้อความ
ไดเรกทอรีของฉัน
มาโครนี้จะส่งคืนเส้นทางของ Makefile ที่รวมไว้ล่าสุด ซึ่งโดยทั่วไปจะเป็น
ไดเรกทอรีปัจจุบันของ Android.mk
my-dir
มีประโยชน์สำหรับคำจำกัดความ
LOCAL_PATH
ที่จุดเริ่มต้นของไฟล์ Android.mk
เช่น
LOCAL_PATH := $(call my-dir)
จากวิธีการทำงานของ GNU Make สิ่งที่มาโครนี้ส่งคืนจริงๆ คือเส้นทางของ
ไฟล์สร้างครั้งล่าสุดที่ระบบบิลด์รวมไว้เมื่อแยกวิเคราะห์สคริปต์บิลด์ สำหรับ
ด้วยเหตุนี้ คุณจึงไม่ควรเรียก my-dir
หลังจากรวมไฟล์อื่น
ตัวอย่างเช่น โปรดพิจารณาตัวอย่างต่อไปนี้
LOCAL_PATH := $(call my-dir)
# ... declare one module
include $(LOCAL_PATH)/foo/`Android.mk`
LOCAL_PATH := $(call my-dir)
# ... declare another module
ปัญหาคือ การเรียกใช้ my-dir
ครั้งที่สองกำหนดให้ LOCAL_PATH
เป็น $PATH/foo
แทน $PATH
เนื่องจากเป็นตำแหน่งที่การรวมล่าสุดชี้ไป
คุณสามารถหลีกเลี่ยงปัญหานี้ได้โดยใส่การรวมเพิ่มเติมหลังส่วนอื่น
ในไฟล์ Android.mk
เช่น
LOCAL_PATH := $(call my-dir)
# ... declare one module
LOCAL_PATH := $(call my-dir)
# ... declare another module
# extra includes at the end of the Android.mk file
include $(LOCAL_PATH)/foo/Android.mk
หากจัดโครงสร้างไฟล์ด้วยวิธีนี้ไม่ได้ ให้บันทึกค่าของการเรียก my-dir
ครั้งแรกลงในตัวแปรอื่น เช่น
MY_LOCAL_PATH := $(call my-dir)
LOCAL_PATH := $(MY_LOCAL_PATH)
# ... declare one module
include $(LOCAL_PATH)/foo/`Android.mk`
LOCAL_PATH := $(MY_LOCAL_PATH)
# ... declare another module
ไฟล์ย่อยทั้งหมด
แสดงรายการไฟล์ Android.mk
ที่อยู่ในไดเรกทอรีย่อยทั้งหมดของ
เส้นทางmy-dir
ปัจจุบัน
คุณสามารถใช้ฟังก์ชันนี้เพื่อระบุลำดับชั้นของไดเรกทอรีต้นทางที่ซ้อนลึกสำหรับ
ระบบบิลด์ โดยค่าเริ่มต้น NDK จะค้นหาเฉพาะไฟล์ในไดเรกทอรีที่มีไฟล์ Android.mk
this-makefile
แสดงเส้นทางของไฟล์บิลด์ปัจจุบัน (ซึ่งระบบบิลด์ใช้ชื่อว่า )
ไฟล์หลัก
แสดงผลเส้นทางของไฟล์ Make หลักในต้นไม้การรวม (เส้นทางของไฟล์ Make ที่รวมไฟล์ Make ปัจจุบัน)
grand-parent-makefile
แสดงผลเส้นทางของไฟล์ Make ระดับปู่ย่าตายายในต้นไม้การรวม (เส้นทางของไฟล์ Make ที่รวมไฟล์ Make ในปัจจุบัน)
โมดูลนำเข้า
ฟังก์ชันที่ช่วยให้คุณค้นหาและรวมไฟล์ Android.mk
ของโมดูลได้โดย
ชื่อของโมดูล ตัวอย่างทั่วไปมีดังนี้
$(call import-module,<name>)
ในตัวอย่างนี้ ระบบบิลด์จะมองหาโมดูลที่ติดแท็ก <name>
ใน
รายการไดเรกทอรีที่อ้างอิงว่าสภาพแวดล้อม NDK_MODULE_PATH
ของคุณ
และรวมไฟล์ Android.mk
ไว้ให้คุณโดยอัตโนมัติ