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