2013-02-17 43 views
5

मेरे पास मौजूदा पुस्तकालयों की एक श्रृंखला है जिसे मुझे एंड्रॉइड एप्लिकेशन में फिर से उपयोग करने की आवश्यकता है।एंड्रॉइड एनडीके के साथ सही निर्भरता क्रम में एकाधिक परियोजनाओं का निर्माण कैसे करें?

\ पुस्तकालय \ libOne
\ पुस्तकालय \ libTwo [स्टेटिक पुस्तकालय]
\ पुस्तकालय \ libThree
\ आवेदन \ MyApplication \ [आवेदन]

libTwo निर्भर करता है: लेआउट के समान है libOne पर, और libThreelibTwo पर निर्भर करता है। सही क्रम में सभी पुस्तकालयों को बनाने के लिए मैं बिल्ड सिस्टम कैसे प्राप्त कर सकता हूं? मैं ग्रहण का उपयोग करने की कोशिश कर रहा हूं, लेकिन यदि आवश्यक हो तो मैं कमांड लाइन का उपयोग कर सकता हूं।

इन सभी पुस्तकालयों को अंततः जावा एप्लिकेशन द्वारा संदर्भित किया जाएगा (और उनके साथ बातचीत करने के लिए जेएनआई का उपयोग करें)। मैं एंड्रॉइड.एमके/एप्लीकेशन.एमके फाइलों को कैसे सेट अप करता हूं इस पर कोई संकेत?

मैंने lib12wo के लिए BUILD_STATIC_LIBRARY का उपयोग करने का प्रयास किया है, लेकिन यह वास्तव में किसी भी फाइल को आउटपुट नहीं करता है! मैं libTwo.a फ़ाइल की अपेक्षा कर रहा था, लेकिन कुछ भी संकलित या निर्मित नहीं हुआ।

क्या मैं एप्लिकेशन में एक एंड्रॉइड.एमके लिखता हूं? या प्रत्येक परियोजना के लिए एक Android.mk?

+0

आप अपने Android.mk बता सकते हैं? यह स्पष्ट नहीं है कि आप अपनी परियोजनाओं को कैसे स्थापित करते हैं। –

+0

@AlexCohn मेरे पास अभी तक एक एंड्रॉइड.एमके काम नहीं है, यह समस्या है। मैं एक उत्तर की तलाश में हूं जो बताता है कि सभी तीन पुस्तकालयों को कैसे बनाया जाए और उन्हें मुख्य एप्लिकेशन से एक साथ जोड़ने के लिए कहा जाए। –

+0

मैं समझता हूं कि आपके पास अभी तक एक एंड्रॉइड.एमके काम नहीं कर रहा है, लेकिन आपके पास अभी तक काम नहीं कर रहा है, है ना? –

उत्तर

0

परियोजनाओं के गुणों में एक एंड्रॉइड अनुभाग है, जहां आप लाइब्रेरी निर्भरताओं को संपादित कर सकते हैं। इसका उपयोग केवल तभी किया जा सकता है, यदि libOne libTwo और libThree को उनके गुण पैनल में पुस्तकालयों के रूप में चिह्नित किया जाता है।

3

ठीक है, अब मैं आपका संपादन देखता हूं, और इससे विशिष्ट प्रश्न का उत्तर देना संभव हो जाता है। आप एंड्रॉयड NDK उपयोग करने के लिए अपनी मूल पुस्तकालय/एँ निर्माण करना चाहते हैं, तो

आप चाहिए आपके आवेदन के लिए कम से कम एक Android.mk फ़ाइल है। हालांकि, यह एक आवश्यकता नहीं है। हालांकि इसे बनाने के लिए ठीक है हालांकि सीमेक, या "पारंपरिक" मेकफ़ाइल के साथ "स्टैंडअलोन टूलचेन" या एमएस विजुअल स्टूडियो प्लगइन या किसी अन्य तरीके से। यह परिणाम है कि मायने रखता है। नतीजा एक साझा वस्तु है जो एक बायोनिक रनटाइम के लिए एक संगत कंपाइलर के साथ बनाया गया है।

यह ${project_root}/libs/armeabi/ निर्देशिका में पुस्तकालय डाल करने के लिए गुड समझ में आता है (एआरएम v6 संगत उपकरणों, x86 के लिए अन्य उप निर्देशिकाओं के लिए, MIPS, हाथ v7a) APK बिल्डर सही ढंग से पैक, ऐप्लिकेशन इंस्टॉलर सही संस्करण खोल करने की अनुमति की अनुमति के लिए (डिवाइस प्रोसेसर के साथ संगत) डिवाइस पर /data/data/${package_name}/lib निर्देशिका में, और अंततः जावा से इसका उपयोग करने के लिए System.loadLibrary(short_name) का उपयोग करने में सक्षम होने के लिए। लेकिन so फ़ाइल को अलग-अलग पैक करना भी संभव है, इसे मैन्युअल रूप से अनपैक करें, और डिवाइस फ़ाइल सिस्टम पर किसी भी स्थान से लोड करें (बशर्ते आपके ऐप को इस फ़ाइल को लिखने और पढ़ने की अनुमति हो)।

लेकिन अगर हम विदेशी मामलों को फ़िल्टर करते हैं, तो ${project_root}/jni निर्देशिका में एंड्रॉइड.एमके होना अधिक आरामदायक है। ndk-build कमांड के मामले में, प्रत्येक लाइब्रेरी एक अलग मॉड्यूल है, लेकिन सभी तीन को एक Android.mk फ़ाइल में परिभाषित किया जा सकता है। दूसरी तरफ, यदि आपके पुस्तकालय अलग हैं (उदा। अलग तृतीय पक्षों से आते हैं), तो आप शायद तीन एंड्रॉइड.एमके फाइलें बनाना पसंद करेंगे। सौभाग्य से, ndk-build gnu बनाने के आसपास एक रैपर के अलावा कुछ भी नहीं है, और एंड्रॉइड.एमके में सरल include कथन किसी अन्य मेकफ़ाइल में काम करता है।

सारांश में, अपने मामले शायद एक सरल Applications/MyApplication/ [Application]/jni/Android.mk फ़ाइल से आच्छादित है:

include ../../Libraries/libOne/Android.mk 
include ../../Libraries/libTwo/Android.mk 
include ../../Libraries/libThree/Android.mk 

मैं क्या निर्भरता आप libOne और libTwo के बीच है पता नहीं है, लेकिन libOne के लिए फ़ाइल Libraries/libOne/Android.mk

तरह दिखेगा
LOCAL_PATH = $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE := libOne 
LOCAL_SRC_FILES := first.c 
include $(BUILD_STATIC_LIBRARY) 

और Libraries/libThree/Android.mk

LOCAL_PATH = $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE := libThree 
LOCAL_SRC_FILES := third.c 
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../libOne $(LOCAL_PATH)/../libTwo 
LOCAL_STATIC_LIBRARIES := libOne libTwo 
include $(BUILD_SHARED_LIBRARY) 

आपको Applications/MyApplication/ [Application] निर्देशिका से चलाएं - या तो कमांड प्रॉम्प्ट से, या ग्रहण एडीटी प्लगइन के माध्यम से।

अद्यतन ही jni निर्देशिका में एक Android.mk फ़ाइल द्वारा व्यक्त की जा सकती है:

LOCAL_PATH = ../../Libraries/libOne 
include $(CLEAR_VARS) 
LOCAL_MODULE := libOne 
LOCAL_SRC_FILES := first.c 
include $(BUILD_STATIC_LIBRARY) 

LOCAL_PATH = ../../Libraries/libThree 
include $(CLEAR_VARS) 
LOCAL_MODULE := libThree 
LOCAL_SRC_FILES := third.c 
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../libOne $(LOCAL_PATH)/../libTwo 
LOCAL_STATIC_LIBRARIES := libOne libTwo 
include $(BUILD_SHARED_LIBRARY) 
+0

इसके लिए धन्यवाद, मैंने कई एंड्रॉइड.एमके फाइलों का उपयोग करने की कोशिश की, लेकिन इसने LOCAL_PATH ('$ (कॉल my-dir) को फिर से परिभाषित करने में समस्याएं उत्पन्न कीं, एनडीके कोर निर्देशिका को वापस कर दिया, वास्तविक निर्देशिका नहीं, जब पहली पंक्ति पर नहीं कहा जाता है! –

+0

बिल्कुल ! $ (मेरा-डीआईआर कॉल करें) 'फ़ाइल में पहली पंक्तियों में से एक होना चाहिए। लेकिन इसका एक या एकाधिक एंड्रॉइड.एमके फाइलों के सवाल से कोई लेना देना नहीं है। ** अपडेट ** देखें ** –