يدعم NDK استخدام المكتبات مسبقة الإنشاء، الثابتة والمشتركة. هناك حالتا استخدام رئيسيتان لهذه الوظيفة:
- توزيع مكتباتك الخاصة على مطوّري برامج 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 للمكتبات المُنشأة مسبقًا
يجب أن تتأكد من اختيار الإصدار المناسب من المكتبة المشتركة التي تم إنشاؤها مسبقًا
لواجهة برمجة التطبيقات المستهدفة. يمكن للمتغيّر 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
.