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

يدعم 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 للمكتبات المُنشأة مسبقًا

يجب أن تتأكد من اختيار الإصدار المناسب من المكتبة المشتركة التي تم إنشاؤها مسبقًا لواجهة برمجة التطبيقات المستهدفة. يمكن للمتغيّر 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.