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

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 دایرکتوری ریشه پروژه شما است.

به کتابخانه از پیش ساخته شده از ماژول های دیگر ارجاع دهید

To reference a prebuilt library from other modules, specify its name as the value of the LOCAL_STATIC_LIBRARIES or LOCAL_SHARED_LIBRARIES variable in the Android.mk files associated with those other modules.

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

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

The code in foo-user.c depends on specific declarations that normally reside in a header file, such as foo.h , distributed with the prebuilt library. برای مثال، 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)

The LOCAL_EXPORT_C_INCLUDES definition here ensures that the build system exports the path to the prebuilt library's include directory, prepending that path onto the value of the LOCAL_C_INCLUDES for the module dependent on it.

این عملیات به سیستم ساخت اجازه می دهد تا هدرهای لازم را پیدا کند.

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

توصیه می کنیم کتابخانه های مشترک از پیش ساخته شده حاوی نمادهای اشکال زدایی را ارائه کنید. The NDK build system always strips the symbols from the version of the library that it installs into $PROJECT/libs/<abi>/ , but you can use the debug version for debugging with 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 استفاده می‌کند.