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.