2011-06-22 13 views
8

के लिए प्री-बिल्ट स्टैटिक लाइब्रेरी का उपयोग करके मैं एक एंड्रॉइड एप्लिकेशन बनाने की कोशिश कर रहा हूं जो कुछ मौजूदा सी ++ कोड से स्थिर पुस्तकालयों का उपयोग करता है। हालांकि, मुझे चीजें बनाने की प्रतीत नहीं हो रही है, यहां तक ​​कि मैंने अभी तक किए गए कदम हैं ..एंड्रॉइड एनडीके विकास

मेरे पास ndk-r5b है और मैंने एनएनडी/डॉक्स/स्टैंडलाइन-टूल्चेन.html के अनुसार स्टैंडअलोन टूलचेन बनाया है। मैंने मेकफ़ाइल में CXX ध्वज के लिए g ++ के बजाय स्टैंडअलोन टूलचेन कंपाइलर (आर्म-लिनक्स-एंड्रोइडबी-जी ++) का उपयोग किया है जो मुझे आवश्यक स्थिर पुस्तकालयों को संकलित करता है। यह त्रुटियों के बिना संकलित करता है और 3 स्थैतिक पुस्तकालयों का उत्पादन होता है।

arm-linux-androideabi-g++ -c -DTIME_SIM -I./include -I/home/greg/dev/Android/android-ndk-r5b/platforms/android-8/arch-arm/usr/include/ -fpic -ggdb3 -SimTime.C -o SimTime.o 

अगला मैं निर्माण:

CXX = arm-linux-androideabi-g++ 
SYSTEM_LIBS = -lstdc++ -lm 
INCLUDE_PATH += ${NDK_PATH}/platforms/android-8/arch-arm/usr/include/ 

यहां नमूने लाइन है कि makefile से जब संकलन उत्पादन किया जाता है: यहाँ पहले से बनाए गए पुस्तकालयों का निर्माण करने के लिए इस्तेमाल झंडे में से कुछ की एक कोड का टुकड़ा है

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := engine 
LOCAL_SRC_FILES := ../libs/libEngine.a 
include $(PREBUILT_STATIC_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := shmem 
LOCAL_SRC_FILES := ../libs/libShMem.a 
include $(PREBUILT_STATIC_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := util 
LOCAL_SRC_FILES := ../libs/libUtil.a 
include $(PREBUILT_STATIC_LIBRARY) 

# build server as a shared library 
include $(CLEAR_VARS) 
LOCAL_MODULE := libServer 
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../include 

LOCAL_SRC_FILES := \ 
    Server.C \ 
    Router.C \ 
    RouterMsgs.C \ 
    Federation.C \ 
    cripName.C \ 
    ver.C \ 
    JNIWrapper.cpp 
LOCAL_STATIC_LIBRARIES := engine shmem util 
include $(BUILD_SHARED_LIBRARY) 

पहले से बनाए गए पुस्तकालयों ठीक एंड्रो में दिए गए स्टैंडअलोन toolchain संकलक का उपयोग कर संकलन: NDK-निर्माण का उपयोग कर Android.mk के लिए निम्नलिखित का उपयोग करके ऐप आईडी एनडीके हालांकि, ndk-build का उपयोग करते हुए साझा लाइब्रेरी को प्रीबिल्ट लाइब्रेरी में लिंक करते समय ओस्ट्रीम के कई अनसुलझे संदर्भ हैं। exampe के लिए:

/home/android/obj/local/armeabi/libShMem.a(SubscriptionItem.o): In function `SUBSCRIPTION_ITEM::Print(std::basic_ostream<char, std::char_traits<char> >&)':/home/src/comm/SubscriptionItem.C:97: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)' 

मुझे लगता है मैं कुछ महत्वपूर्ण झंडे याद आ रही है या कुछ सही नहीं कर रही है जब मैं स्टैंडअलोन संकलक लेकिन कोई मदद या इस मुद्दे पर जानकारी का उपयोग कर बहुत सराहना की जाएगी संकलन कर रहा हूँ नहीं कर सकते जैसा कि मैंने इस खोजने के लिए प्रतीत मान गूगल पर या किसी भी एंड्रॉइड एनएनडीके दस्तावेज़ों में जवाब। धन्यवाद!

+0

मुझे यकीन नहीं है कि यह एक अच्छा विचार है। यदि आप पूरी तरह से स्थाई रूप से जुड़ी लाइब्रेरी बनाते हैं जो libstdC++ पर निर्भर करता है, तो आप लाइब्रेरी में उन कार्यों की एक प्रति सहित समाप्त हो जाएंगे। लेकिन जब आप फोन पर लाइब्रेरी लोड करते हैं, तो आप इसे उस प्रक्रिया में लोड कर देंगे, जिसमें पहले से ही libstdC++ का एक साझा मैपिंग है जिसे एप्लिकेशन को ज़ीगोट से फोर्क किया गया था। यह कम से कम, अपमानजनक है। पुस्तकालयों को असंतुष्ट निर्भरताओं के लिए अनुमति देने के लिए बिल्ड ध्वज का उपयोग करना बेहतर हो सकता है? –

उत्तर

1

मेरे पास एक ही समस्या थी और इसे मानक सी ++ लाइब्रेरी के लिए मॉड्यूल जोड़कर हल किया गया। एनएनडी-बिल्ड सिस्टम द्वारा लिखी गई लाइब्रेरी गलत स्थान (प्लेटफ़ॉर्म/एंड्रॉइड-9/आर्क-आर्म/यूएसआर/मेरे मामले में lib) से है।

include $(CLEAR_VARS) 
LOCAL_MODULE := rightstdc 
LOCAL_SRC_FILES := <path to the correct libstdc++.a> 
include $(PREBUILT_STATIC_LIBRARY) 

स्थिर पुस्तकालयों की सूची में मॉड्यूल टैग जोड़ें:

LOCAL_STATIC_LIBRARIES := engine shmem util rightstdc 

build/core/build-binary.mk पहले जोड़ता है -L$(SYSROOT)/usr/lib किसी भी लाइब्रेरी LOCAL_LDLIBS में लेकिन मेरे मामले गलत रास्ता है कि में निर्दिष्ट कर रहे हैं।

मुझे नहीं पता कि कोई गुम कदम है या नहीं, उस स्थान पर सही libstdC++ की प्रतिलिपि बनाना चाहिए लेकिन ऊपर का दृष्टिकोण काम करेगा।

+0

कुछ सीपीपी झंडे के साथ Application.mk में अपनी सी ++ लाइब्रेरी से संबंधित जानकारी जोड़ें –

3

ठीक है, आप वास्तव में ठीक कर सकते हैं कि एक ही फ़ोल्डर के अंदर एक Application.mk फ़ाइल बनाने के रूप में Android.mk फ़ाइल है, जिसमें वह:

APP_STL := stlport_static 

स्थिर STLport कि अंदर स्थित है उपयोग करने के लिए एंड्रॉइड एनडीके।

संबंधित मुद्दे