के लिए प्री-बिल्ट स्टैटिक लाइब्रेरी का उपयोग करके मैं एक एंड्रॉइड एप्लिकेशन बनाने की कोशिश कर रहा हूं जो कुछ मौजूदा सी ++ कोड से स्थिर पुस्तकालयों का उपयोग करता है। हालांकि, मुझे चीजें बनाने की प्रतीत नहीं हो रही है, यहां तक कि मैंने अभी तक किए गए कदम हैं ..एंड्रॉइड एनडीके विकास
मेरे पास 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*)'
मुझे लगता है मैं कुछ महत्वपूर्ण झंडे याद आ रही है या कुछ सही नहीं कर रही है जब मैं स्टैंडअलोन संकलक लेकिन कोई मदद या इस मुद्दे पर जानकारी का उपयोग कर बहुत सराहना की जाएगी संकलन कर रहा हूँ नहीं कर सकते जैसा कि मैंने इस खोजने के लिए प्रतीत मान गूगल पर या किसी भी एंड्रॉइड एनएनडीके दस्तावेज़ों में जवाब। धन्यवाद!
मुझे यकीन नहीं है कि यह एक अच्छा विचार है। यदि आप पूरी तरह से स्थाई रूप से जुड़ी लाइब्रेरी बनाते हैं जो libstdC++ पर निर्भर करता है, तो आप लाइब्रेरी में उन कार्यों की एक प्रति सहित समाप्त हो जाएंगे। लेकिन जब आप फोन पर लाइब्रेरी लोड करते हैं, तो आप इसे उस प्रक्रिया में लोड कर देंगे, जिसमें पहले से ही libstdC++ का एक साझा मैपिंग है जिसे एप्लिकेशन को ज़ीगोट से फोर्क किया गया था। यह कम से कम, अपमानजनक है। पुस्तकालयों को असंतुष्ट निर्भरताओं के लिए अनुमति देने के लिए बिल्ड ध्वज का उपयोग करना बेहतर हो सकता है? –