استخدام المكتبات المصمَّمة مسبقًا

يدعم NDK استخدام المكتبات الثابتة مسبقًا والمشتركة. هناك هما حالتا استخدام رئيسيتان لهذه الوظيفة:

  • يؤدي توزيع مكتباتك إلى مطوري 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 أن يوجّه نظام الإصدار إلى الصفحة ونسخة من المكتبة.

على سبيل المثال، لنفترض أن مشروعك يحتوي على نسختين من المكتبة 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.