2013-03-06 7 views
8

मेरे पास सी में लिखा गया मूल स्रोत कोड है जो मैं अपने एंड्रॉइड डिवाइस (नेक्सस 7) पर चलाना चाहता हूं। एंड्रॉइड एनडीके का उपयोग करके एंड्रॉइड पर देशी कोड चलाने पर मैंने पहले से ही बहुत सारे शोध और ऑनलाइन ट्यूटोरियल सफलतापूर्वक किए हैं। मुझे इस पर काफी कुछ ज्ञान मिला। हालांकि, मेरे द्वारा जो कोड है, वह मानक गणित पुस्तकालय की जटिल कार्यक्षमताओं का उपयोग करता है, जिसे जटिल.h में परिभाषित किया गया है। हालांकि एनडीके सी लाइब्रेरी जटिल कार्यक्षमताओं का समर्थन नहीं कर रही है। जब भी मैं इस परियोजना पर एक NDK-निर्माण करना मुझे मिलता है:एंड्रॉइड एनडीके के लिए मैं जटिल एचएच का उपयोग कैसे कर सकता हूं?

fatal error: complex.h: no such file or directory. 

एक समाधान मैं हाथ-linux-gnueabi से मानक गणित पुस्तकालय (libm.a) हो रही है के बारे में सोचा के रूप में और मेरे देशी स्रोत के साथ लिंक।

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := StandardC 
LOCAL_SRC_FILES := libc.a 
include $(PREBUILT_STATIC_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := mathLib 
LOCAL_SRC_FILES := libm.a 
LOCAL_STATIC_LIBRARIES := StandardC 
include $(PREBUILT_STATIC_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := ComplexOperations 
LOCAL_SRC_FILES := libComplexOperations.a 
LOCAL_STATIC_LIBRARIES := mathLib 
LOCAL_C_INCLUDES += /usr/arm-linux-gnueabi/include 
include $(PREBUILT_STATIC_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := MySource 
LOCAL_CFLAGS += -std=c99 
LOCAL_SRC_FILES := com_samuel_test_ComplexOperationsLib.c 
LOCAL_C_INCLUDES += /usr/arm-linux-gnueabi/include 
LOCAL_STATIC_LIBRARIES := ComplexOperations 
include $(BUILD_SHARED_LIBRARY) 

मैं भी libm यह जरूरत के रूप में हाथ-linux-gnueabi-जीसीसी के libc से जोड़ने के लिए किया था: यहाँ मेरी Android.mk है। "कॉम्प्लेक्सऑपरेशंस" मॉड्यूल को संकलक फ्लैग-मार्च = armv7-a के साथ arm-linux-gnueabi-gcc का उपयोग करके स्थिर रूप से संकलित किया गया था। यह पुस्तकालय जटिल.h का उपयोग करता है। यह बिना किसी त्रुटि और चेतावनियों के बनाता है। लेकिन जब मैं आवेदन चलाने के लिए और फोन

System.loadLibrary("MySource"); 

मैं logcat पर इस त्रुटि मिलती है:

E/dalvikvm(3932): dlopen("/data/app-lib/com.samuel.test-1/libMySource.so") failed: Cannot load library: soinfo_relocate(linker.cpp:975): cannot locate symbol ".LANCHOR2" referenced by "libMySource.so"... 

इस त्रुटि एक UnsatisfiedLinkError अपवाद फेंक दिया जाता है जो यदि संभाला नहीं क्रैश करने का आवेदन का कारण बनता है पर।

क्या कोई मेरी मदद कर सकता है !! मैंने पहले ही इसे अपने लिए बाहर निकालने की कोशिश की है !! :(

+1

एंड्रॉइड गंभीरता से 'complex.h' नहीं है? –

उत्तर

0

हल!

सबसे पहले मैं चाहिए ' मैंने एंड्रॉइड एनडीके द्वारा प्रदान किए गए टूलचेन के साथ अपने कॉम्प्लेक्सऑपरेशंस स्रोतों का निर्माण किया है, क्योंकि दस्तावेज स्पष्ट रूप से gnu compilers के साथ क्रॉस-कंपाइल नहीं करने के लिए कहता है। तो यह मेरी पहली गलती थी। था अकेले ही मेरी समस्या को हल नहीं किया क्योंकि मुझे अभी भी जटिल मिला है। जब मैं एनएनडी-बिल्ड करता हूं तो त्रुटि नहीं मिली। एंड्रॉइड एनडीके में मानक libc का एक बहुत ही सीमित कार्यान्वयन है। इसे हल करने के लिए मैंने क्रिस्टाक्स एनडीके का उपयोग किया, जो एंड्रॉइड एनडीके का एक विस्तारित कार्यान्वयन था। यह सब कुछ हल हो गया !!

+0

आपने समस्या को हल करने का प्रबंधन कैसे किया? आपने क्रिस्टाक्स से क्रॉस-कंपाइलर का उपयोग किया है? – JohnTortugo

+0

यह थोड़ी देर पहले हुआ है, लेकिन अगर मैं ऊपर अपना जवाब देखता हूं तो मैंने क्रॉस-संकलन और क्रिस्टाक्स के एनडीके-बिल्ड टूल का उपयोग करने के लिए एंड्रॉइड एनडीके के टूलचेन का उपयोग किया। हो सकता है कि एंड्रॉइड एनडीके का एनएनडीके-बिल्ड टूल अब जटिल एच पुस्तकालय का समर्थन करता है। लेकिन अगर नहीं, क्रिस्टाक्स करेगा। सौभाग्य! – Sam

+0

लगता है कि केवल g ++ में जटिल.h फ़ाइल है। मैं क्रिस्टाक्स क्रॉस-कंपाइलर्स पर भी विचार कर रहा हूं। वैसे भी Thx। – JohnTortugo

0

ऐसा लगता है अपने पथ की तरह टूट गया है। कृपया इस मुद्दे को हल करने के लिए पोस्ट निम्नलिखित को देखें।

Android NDK: how to include Android.mk into another Android.mk (hierarchical project structure)?

android ndk error "no such file or directory"?

+0

धन्यवाद यासीर। लेकिन मेरे पैथ को तोड़ा नहीं गया है क्योंकि कंपाइलर अन्य सभी शीर्षकों को ढूंढ सकता है। यह सिर्फ इतना है कि एनडीके का उपयोग करने वाला संकलक जटिल संचालन का समर्थन नहीं करता है जिसे गणित lib में परिभाषित किया जाना चाहिए था। मुझे लगता है कि मैंने अपने स्रोत के साथ बायोनिक गणित lib को जोड़कर उस समस्या को हल कर लिया है, लेकिन अब मैं लिंकिंग त्रुटि समस्या में फंस गया! मैंने पुस्तकालयों पर एक objdump किया है और सीखा है कि। LANCHOR2 libc.a में परिभाषित किया गया है जिसे मैंने अपने स्रोत से जोड़ा (मेरा एंड्रॉइड.एमके देखें)। मुझे लगता है कि मुझे एंड्रॉइड के लिए libc को लोड करने के लिए अब एक रास्ता खोजना चाहिए – Sam

1

मैंने निम्न पंक्ति को Android.mk पर जोड़ा, जो समस्या को हल करता है।

LOCAL_C_INCLUDES += C:\Users\Sami\workspace\android-ndk-r8e\sources\cxx-stl\gnu-libstdc++\4.7\include\ 

सुनिश्चित नहीं हैं कि चर, C:\Users\Sami\workspace\ भाग की जगह लेंगे, इसलिए यदि किसी को भी पता है, कृपया बताऊँ।


संपादित करें: वास्तव में, यह है कि केवल कुछ कारण त्रुटि हटा दिया है, लेकिन यह मैं क्या देखा से इस समस्या को ठीक नहीं किया। उस नोट पर, C:\Users\Sami\workspace\android-ndk-r8e को $(NDK_ROOT) के साथ बदल दिया गया था।

मैंने क्रिस्टैक्स के एनडीके की कोशिश की, लेकिन मुझे complex.h त्रुटि नहीं मिली। मैंने जो कुछ किया वह बस मेरी jni निर्देशिका में complex.h और _mingw.h की प्रतिलिपि बना रहा था। सब कुछ काम करता है यह कोड x86 और एआरएम एमुलेटर दोनों पर परीक्षण किया गया था।

2

एंड्रॉइड-एल (ओलीपॉप) के रूप में एनडीके अब जटिल.h हेडर प्रदान करता है।

https://developer.android.com/tools/sdk/ndk/index.html से नवीनतम एनडीके संशोधन डाउनलोड करें और जटिल.h /platforms/android-L/arch-arm/usr/include में पाया जा सकता है।

+0

अपडेट के लिए धन्यवाद !! – Sam

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

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