NDK תומך בשימוש בספריות מוכנות מראש, גם סטטיות וגם משותפות. יש הם שני תרחישים עיקריים לדוגמה של הפונקציונליות הזו:
- להפיץ ספריות משלכם למפתחי NDK של צד שלישי ללא להפיץ את המקורות שלך.
- שימוש בגרסה מוכנה מראש של ספריות כדי לזרז את ה-build.
בדף הזה מוסבר איך להשתמש בספריות מוכנות מראש.
הצהרה על ספרייה שנוצרה מראש
צריך להצהיר על כל ספרייה מוכנה מראש שבה משתמשים כמודול עצמאי. לבצע לכן, מבצעים את השלבים הבאים:
- נותנים שם למודול. השם הזה לא חייב להיות זהה לשם של השם שנוצר מראש עצמו.
בקובץ 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)
בדוגמה זו, שם המודול זהה לשם של המודול לספרייה.
מערכת ה-build מציבה עותק של הספרייה המשותפת שמובנית מראש
$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>
במקרה כזה, צריך לספק את הכותרת ואת נתיב ההכללה שלה אל
מהדר (compiler) כשמפתחים את המודול 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
כאן מבטיחה שמערכת ה-build
מייצאת את הנתיב לספריית include
של הספרייה שמובנית מראש, ותלויה
נתיב לערך של LOCAL_C_INCLUDES
עבור המודול שתלוי בו.
הפעולה הזו מאפשרת למערכת ה-build למצוא את הכותרות הנדרשות.
ניפוי באגים בספריות שנוצרו מראש
מומלץ לספק ספריות משותפות מוכנות מראש שכוללות ניפוי באגים
סמלים. מערכת ה-build של NDK תמיד מסירה את הסמלים
שאותה הוא מתקין ב-$PROJECT/libs/<abi>/
, אבל אפשר להשתמש בניפוי באגים.
לניפוי באגים באמצעות ndk-gdb
.
בחירת ממשקי ABI לספריות מוכנות מראש
עליך לוודא שבחרת את הגרסה הנכונה של הספרייה המשותפת שהוגדרה מראש
לממשק ה-ABI המטורגט. TARGET_ARCH_ABI
בקובץ Android.mk יכול להפנות את מערכת ה-build
של הספרייה.
לדוגמה, נניח שהפרויקט שלכם מכיל שתי גרסאות של הספרייה
libfoo.so
:
armeabi/libfoo.so
x86/libfoo.so
קטע הקוד הבא מראה איך להשתמש ב-TARGET_ARCH_ABI
כדי שה-build
המערכת בוחרת את הגרסה המתאימה של הספרייה:
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
, ה-build
המערכת משתמשת בגרסה של libfoo.so
שנמצאת בספרייה armeabi
. אם המיקום
ציינת את x86
כערך TARGET_ARCH_ABI
, מערכת ה-build תשתמש
את הגרסה בספרייה x86
.