שימוש בספריות מוכנות מראש

NDK תומך בשימוש בספריות מוכנות מראש, גם סטטיות וגם משותפות. יש הם שני תרחישים עיקריים לדוגמה של הפונקציונליות הזו:

  • להפיץ ספריות משלכם למפתחי NDK של צד שלישי ללא להפיץ את המקורות שלך.
  • שימוש בגרסה מוכנה מראש של ספריות כדי לזרז את ה-build.

בדף הזה מוסבר איך להשתמש בספריות מוכנות מראש.

הצהרה על ספרייה שנוצרה מראש

צריך להצהיר על כל ספרייה מוכנה מראש שבה משתמשים כמודול עצמאי. לבצע לכן, מבצעים את השלבים הבאים:

  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)

בדוגמה זו, שם המודול זהה לשם של המודול לספרייה.

מערכת ה-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.