NDK รองรับการใช้ไลบรารีที่สร้างไว้ล่วงหน้า ทั้งแบบคงที่และแบบใช้ร่วมกัน มี เป็นกรณีการใช้งานหลัก 2 กรณีสำหรับฟังก์ชันนี้
- เผยแพร่ไลบรารีของคุณเองให้กับนักพัฒนาซอฟต์แวร์ NDK บุคคลที่สาม แจกจ่ายแหล่งข้อมูลของคุณ
- ใช้ไลบรารีของคุณเวอร์ชันที่สร้างไว้ล่วงหน้าเพื่อเร่งการสร้างให้เร็วขึ้น
หน้านี้จะอธิบายวิธีใช้ไลบรารีที่สร้างไว้ล่วงหน้า
ประกาศไลบรารีที่สร้างไว้ล่วงหน้า
คุณต้องประกาศไลบรารีที่สร้างไว้ล่วงหน้าแต่ละรายการที่คุณใช้เป็นโมดูลอิสระ สิ่งต้องทำ ดังนั้น ให้ทำตามขั้นตอนต่อไปนี้
- ตั้งชื่อโมดูล ชื่อนี้ไม่จำเป็นต้องเหมือนกับชื่อที่สร้างไว้ล่วงหน้า ของไลบรารีก็ได้
ในไฟล์ Android.mk ของโมดูล ให้กำหนดเส้นทางไปยัง
LOCAL_SRC_FILES
ไลบรารีที่สร้างไว้ล่วงหน้าซึ่งคุณจัดไว้ให้ ระบุเส้นทางที่สัมพันธ์กับ ของตัวแปรLOCAL_PATH
รวม
PREBUILT_SHARED_LIBRARY
หรือPREBUILT_STATIC_LIBRARY
ขึ้นอยู่กับ ไม่ว่าคุณจะใช้ไลบรารีที่ใช้ร่วมกัน (.so
) หรือไลบรารีแบบคงที่ (.a
)
ต่อไปนี้เป็นตัวอย่างเล็กๆ น้อยๆ ที่สมมติว่ามีไลบรารี libfoo.so
ที่สร้างไว้ล่วงหน้าอยู่
ในไดเรกทอรีเดียวกับไฟล์ Android.mk ที่อธิบาย
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.so
include $(PREBUILT_SHARED_LIBRARY)
ในตัวอย่างนี้ ชื่อโมดูลเหมือนกับชื่อโมดูลที่สร้างไว้ล่วงหน้า ไลบรารี
ระบบบิลด์จะวางสำเนาของไลบรารีที่ใช้ร่วมกันที่สร้างไว้ล่วงหน้าลงใน
$PROJECT/obj/local
และสำเนาอีกชุดหนึ่งซึ่งนำข้อมูลการแก้ไขข้อบกพร่องออกลงใน
$PROJECT/libs/<abi>
ในที่นี้ $PROJECT
คือไดเรกทอรีรากของโปรเจ็กต์
อ้างอิงไลบรารีที่สร้างไว้ล่วงหน้าจากโมดูลอื่นๆ
ในการอ้างอิงไลบรารีที่สร้างไว้ล่วงหน้าจากโมดูลอื่น ให้ระบุชื่อไลบรารีเป็น
ของตัวแปร LOCAL_STATIC_LIBRARIES
หรือ LOCAL_SHARED_LIBRARIES
ใน
ไฟล์ Android.mk ที่เกี่ยวข้องกับโมดูลอื่นๆ เหล่านั้น
ตัวอย่างเช่น คำอธิบายของโมดูลที่ใช้ libfoo.so
อาจมีลักษณะดังนี้
include $(CLEAR_VARS)
LOCAL_MODULE := foo-user
LOCAL_SRC_FILES := foo-user.c
LOCAL_SHARED_LIBRARIES := foo-prebuilt
include $(BUILD_SHARED_LIBRARY)
ในที่นี้ LOCAL_MODULE
คือชื่อของโมดูลที่หมายถึงโมดูลที่สร้างไว้ล่วงหน้า
LOCAL_SHARED_LIBRARIES
คือชื่อของแหล่งที่มาที่สร้างไว้ล่วงหน้า
ส่งออกส่วนหัวสำหรับไลบรารีที่สร้างไว้ล่วงหน้า
รหัสใน foo-user.c
ขึ้นอยู่กับการประกาศเฉพาะที่ปกติแล้วจะอยู่
ในไฟล์ส่วนหัว เช่น foo.h
ที่เผยแพร่ด้วยไลบรารีที่สร้างไว้ล่วงหน้า สำหรับ
ตัวอย่างเช่น foo-user.c
อาจมีบรรทัดดังนี้
#include <foo.h>
ในกรณีดังกล่าว คุณต้องระบุส่วนหัวและเส้นทางรวมของส่วนหัวไปยัง
คอมไพเลอร์เมื่อคุณสร้างโมดูล foo-user
วิธีง่ายๆ ในการบรรลุเป้าหมายนี้
คือการใช้การส่งออกในการกำหนดโมดูลที่สร้างไว้ล่วงหน้า เช่น ยาว
เนื่องจากส่วนหัว foo.h
อยู่ภายใต้ไดเรกทอรี include
ที่เชื่อมโยงกับ
โมดูลที่สร้างไว้ล่วงหน้า คุณสามารถประกาศได้ดังนี้
include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
คำจำกัดความ LOCAL_EXPORT_C_INCLUDES
ในที่นี้ช่วยให้แน่ใจว่าระบบบิลด์
ส่งออกเส้นทางไปยังไดเรกทอรี include
ของไลบรารีที่สร้างไว้ล่วงหน้า โดย
ไปยังค่าของ LOCAL_C_INCLUDES
สำหรับโมดูลที่ขึ้นอยู่กับค่าดังกล่าว
การดำเนินการนี้ช่วยให้ระบบบิลด์ค้นหาส่วนหัวที่จำเป็นได้
แก้ไขข้อบกพร่องไลบรารีที่สร้างไว้ล่วงหน้า
เราขอแนะนำให้คุณจัดเตรียมไลบรารีที่ใช้ร่วมกันที่สร้างไว้ล่วงหน้าซึ่งมีการแก้ไขข้อบกพร่อง
สัญลักษณ์ ระบบบิลด์ NDK จะตัดสัญลักษณ์จากเวอร์ชันของ
ไลบรารีที่จะติดตั้งลงใน $PROJECT/libs/<abi>/
แต่คุณสามารถใช้การแก้ไขข้อบกพร่องได้
สำหรับแก้ไขข้อบกพร่องด้วย ndk-gdb
เลือก ABI สำหรับไลบรารีที่สร้างไว้ล่วงหน้า
คุณต้องเลือกเวอร์ชันที่ถูกต้องของไลบรารีที่ใช้ร่วมกันซึ่งสร้างไว้ล่วงหน้า
สำหรับ ABI ที่กำหนดเป้าหมาย TARGET_ARCH_ABI
ในไฟล์ Android.mk สามารถชี้ระบบบิลด์ไปยัง
ของไลบรารีก็ได้
ตัวอย่างเช่น สมมติว่าโปรเจ็กต์มีไลบรารี 2 เวอร์ชัน
libfoo.so
:
armeabi/libfoo.so
x86/libfoo.so
ข้อมูลโค้ดต่อไปนี้แสดงวิธีใช้ TARGET_ARCH_ABI
เพื่อให้บิลด์
ระบบจะเลือกไลบรารีรุ่นที่เหมาะสม:
include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libfoo.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
หากคุณระบุ armeabi
เป็นค่าของ TARGET_ARCH_ABI
บิลด์
ระบบใช้เวอร์ชันของ libfoo.so
ที่อยู่ในไดเรกทอรี armeabi
ถ้า
คุณได้ระบุ x86
เป็นค่า TARGET_ARCH_ABI
ซึ่งระบบบิลด์ใช้
เวอร์ชันในไดเรกทอรี x86