2012-04-28 18 views
5

में एकाधिक (मेरी और तृतीय पक्ष) देशी पुस्तकालयों में मुझे दो देशी पुस्तकालयों का उपयोग करना होगा: एक मेरा है और दूसरा तीसरा पक्ष है। जब तक मैं उन्हें अलग परियोजनाओं में इस्तेमाल करता था, तब तक सब कुछ ठीक था। लेकिन अब मुझे Exception Ljava/lang/UnsatisfiedLinkError मिल रहा है।एंड्रॉइड एनडीके

मैं ग्रहण का उपयोग कर रहा हूं।

मुझे पता चला कि अगर मैं मौजूदा लाइब्रेरी को libs/armeabi में रखता हूं, तो ग्रहण देशी कोड का संकलन शुरू करता है और यह विफल हो जाता है। अगर मैं कमांड लाइन से जेएनआई भाग का पुनर्निर्माण करता हूं, तो संकलन सफल होता है लेकिन तीसरी पार्टी लाइब्रेरी गायब हो जाती है। बिलकुल पागल।

तो मैं ग्रहण के साथ एक मौजूदा पुस्तकालय के साथ एक मौजूदा .so लाइब्रेरी का उपयोग करने के लिए ग्रहण कैसे कहूं? पुस्तकालय स्वतंत्र हैं।

उत्तर

7

एनडीके PREBUILT_SHARED_LIBRARY चर का उपयोग करते हुए प्रीबिल्ट उपयोगकर्ता पुस्तकालयों से जुड़ने की अनुमति देता है।

mkdir -p jni/libs 
cp librandom.so jni/libs 

तो बस बनाने के एक jni/libs/Android.mk फ़ाइल,:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := random 
LOCAL_SRC_FILES := librandom.so 
include $(PREBUILT_SHARED_LIBRARY) 

यह मानते हुए कि पुस्तकालय आप लिंक करने की आवश्यकता librandom.so, एक libs फ़ोल्डर प्रोजेक्ट फ़ोल्डर के jni सबफ़ोल्डर में बना

आप प्रत्येक प्रीबिल्ट लाइब्रेरी के लिए एक सेक्शन बना सकते हैं, सभी jni/libs में रखे गए हैं।

इसके बाद, आप सिर्फ बातें काम करने के लिए प्राप्त करने के लिए अपने JNI/Android.mk में ऊपर फ़ाइल को शामिल करने की जरूरत है। NDK डॉक्स में, यह सिफारिश की है कि इस Android.mk के अंत में किया जाना है, बल्कि मध्य से:

include $(LOCAL_PATH)/libs/Android.mk 

हालांकि, अगर आप मॉड्यूल है कि इस पुस्तकालय की आवश्यकता है इससे पहले कि यह करने के लिए की आवश्यकता होगी।

जोड़ने के लिए, आप मॉड्यूल अनुभाग है कि पहले से बनाए गए पुस्तकालय के लिए लिंक में निम्नलिखित जोड़ने की आवश्यकता होगी।

LOCAL_SHARED_LIBRARIES := random 

फिर जब आप NDK-निर्माण करते हैं, यह इस पुस्तकालय libs/armeabi/ में मॉड्यूल के निर्माण से पहले कॉपी जाएगा, और आप के लिए तैयार हैं।

नोट: यह आवश्यक शीर्षकों के साथ समस्याओं का समाधान नहीं करता है। आपको अभी भी उस मॉड्यूल में वैरिएबल LOCAL_C_INCLUDES में पुस्तकालय के लिए हेडर का स्थान जोड़ने की आवश्यकता होगी, जिसके लिए इसकी आवश्यकता है।

+0

अद्यतन: यदि एक पुस्तकालय दूसरे पर निर्भर करता है, तो http://stackoverflow.com/questions/17688327/android-ndk-make-two-native-shared- पुस्तकालय- कॉलिंग- प्रत्येक-other – 18446744073709551615

3

यही वह क्षण है जो मैंने इस पल के लिए किया है। मैं स्वीकार नहीं करूंगा (स्टैक ओवरफ्लो अर्थ में) मेरा अपना (यह) उत्तर है क्योंकि यह असंतोषजनक है।

मैंने एक नई परियोजना बनाई है और वहां सभी जावा फाइलों की प्रतिलिपि बनाई है। फिर, मैंने पुराने प्रोजेक्ट और तीसरी पार्टी लाइब्रेरी से libs/armeabi में .so लाइब्रेरी की प्रतिलिपि बनाई।

यह राक्षसी है। लेकिन यह काम करता है। अभी के लिये। सबसे बुरी चीज यह है कि संस्करण नियंत्रण टारपीडो है।