पहले से बनी लाइब्रेरी इस्तेमाल करना

एनडीके, पहले से बनी लाइब्रेरी के इस्तेमाल के साथ काम करता है. इसमें स्टैटिक और शेयर की गई लाइब्रेरी, दोनों इस्तेमाल की जा सकती हैं. यह लीजिए इस फ़ंक्शन के इस्तेमाल के लिए, ये दो मुख्य काम हैं:

  • अपनी लाइब्रेरी को तीसरे पक्ष के एनडीके डेवलपर को डिस्ट्रिब्यूट किए बिना वह आपके सोर्स को डिस्ट्रिब्यूट करता है.
  • बिल्ड को तेज़ी से पूरा करने के लिए, आपकी लाइब्रेरी के पहले से बने वर्शन का इस्तेमाल करना.

इस पेज पर पहले से बनी लाइब्रेरी इस्तेमाल करने का तरीका बताया गया है.

पहले से बनी लाइब्रेरी का एलान करना

आपको पहले से बनी हर उस लाइब्रेरी के बारे में बताना होगा जिसका इस्तेमाल आप इंडिपेंडेंट मॉड्यूल के रूप में करते हैं. ऐसा करें इसलिए, नीचे दिए गए चरणों को पूरा करें:

  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 आपके प्रोजेक्ट की रूट डायरेक्ट्री है.

दूसरे मॉड्यूल से, पहले से बनी लाइब्रेरी का रेफ़रंस लेना

दूसरे मॉड्यूल में पहले से बनी लाइब्रेरी का रेफ़रंस देने के लिए, उसका नाम 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 मॉड्यूल बनाते हैं. इसे पूरा करने का एक आसान तरीका टास्क, पहले से बने मॉड्यूल की परिभाषा में एक्सपोर्ट का इस्तेमाल करना है. उदाहरण के लिए, जब तक क्योंकि हेडर 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 की वैल्यू का पाथ डालें.

इस कार्रवाई से बिल्ड सिस्टम को ज़रूरी हेडर ढूंढने में मदद मिलती है.

पहले से बनी लाइब्रेरी डीबग करना

हमारा सुझाव है कि आप पहले से बनी हुई ऐसी शेयर की गई लाइब्रेरी उपलब्ध कराएं जिनमें डीबग करने की सुविधा हो चिह्नों का इस्तेमाल करें. एनडीके बिल्ड सिस्टम, हमेशा निशानों को लाइब्रेरी जिसे $PROJECT/libs/<abi>/ में इंस्टॉल किया जाता है, लेकिन आप डीबग का इस्तेमाल कर सकते हैं ndk-gdb की मदद से डीबग करने के लिए वर्शन.

पहले से बनी लाइब्रेरी के लिए एबीआई चुनें

आपको यह पक्का करना होगा कि आप पहले से बनी अपनी शेयर की गई लाइब्रेरी का सही वर्शन चुनें आपके टारगेट किए गए एबीआई के लिए. TARGET_ARCH_ABI Android.mk फ़ाइल में मौजूद वैरिएबल, बिल्ड सिस्टम को सही लाइब्रेरी का एक वर्शन है.

उदाहरण के लिए, मान लीजिए कि आपके प्रोजेक्ट में लाइब्रेरी के दो वर्शन हैं 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 के मान के रूप में तय किया है, तो बिल्ड सिस्टम, armeabi डायरेक्ट्री में मौजूद libfoo.so के वर्शन का इस्तेमाल करता है. अगर आपने आपने x86 को TARGET_ARCH_ABI मान के रूप में तय किया है, बिल्ड सिस्टम x86 डायरेक्ट्री में मौजूद वर्शन.