از کتابخانه های از پیش ساخته شده استفاده کنید

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 ، باید هدر و مسیر شامل آن را به کامپایلر ارائه دهید. یک راه ساده برای انجام این کار، استفاده از صادرات در تعریف ماژول از پیش ساخته شده است. به عنوان مثال، تا زمانی که header 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 می تواند سیستم ساخت را به سمت نسخه مناسب کتابخانه هدایت کند.

به عنوان مثال، فرض کنید پروژه شما حاوی دو نسخه از library 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 استفاده می‌کند.