ใช้ไลบรารีที่สร้างไว้ล่วงหน้า

NDK รองรับการใช้ไลบรารีที่สร้างไว้ล่วงหน้า ทั้งแบบคงที่และแบบใช้ร่วมกัน มี เป็นกรณีการใช้งานหลัก 2 กรณีสำหรับฟังก์ชันนี้

  • เผยแพร่ไลบรารีของคุณเองให้กับนักพัฒนาซอฟต์แวร์ NDK บุคคลที่สาม แจกจ่ายแหล่งข้อมูลของคุณ
  • ใช้ไลบรารีของคุณเวอร์ชันที่สร้างไว้ล่วงหน้าเพื่อเร่งการสร้างให้เร็วขึ้น

หน้านี้จะอธิบายวิธีใช้ไลบรารีที่สร้างไว้ล่วงหน้า

ประกาศไลบรารีที่สร้างไว้ล่วงหน้า

คุณต้องประกาศไลบรารีที่สร้างไว้ล่วงหน้าแต่ละรายการที่คุณใช้เป็นโมดูลอิสระ สิ่งต้องทำ ดังนั้น ให้ทำตามขั้นตอนต่อไปนี้

  1. ตั้งชื่อโมดูล ชื่อนี้ไม่จำเป็นต้องเหมือนกับชื่อที่สร้างไว้ล่วงหน้า ของไลบรารีก็ได้
  2. ในไฟล์ Android.mk ของโมดูล ให้กำหนดเส้นทางไปยัง LOCAL_SRC_FILES ไลบรารีที่สร้างไว้ล่วงหน้าซึ่งคุณจัดไว้ให้ ระบุเส้นทางที่สัมพันธ์กับ ของตัวแปร LOCAL_PATH

  3. รวม 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