मैं एक मूल एआरएम एंड्रॉइड बाइनरी संकलित करने के लिए कुछ दिनों की कोशिश कर रहा हूं जो टर्मिनल एप्लिकेशन का उपयोग करके मेरे फोन पर निष्पादित करेगा। मैं एलएस, एमकेडीआईआर आदि जैसे फोन पर मानक पॉज़िक्स बाइनरी के रूप में एक ही प्रकार की बाइनरी उत्पन्न करना चाहता हूं। मैंने मैक ओएस एक्स के तहत एंड्रॉइड एनडीके डाउनलोड किया है और त्रुटियों के बिना सरल ईएलएफ बाइनरी को संकलित करने में सक्षम हूं। हालांकि, जब मैं उन्हें फोन पर स्थानांतरित करता हूं, तो वे हमेशा सेगफॉल्ट करते हैं। यही है, जब वे जीसीसी में स्टेटिक के साथ संकलित करते हैं तो वे segfault। यदि मैं -स्टैटिक का उपयोग नहीं करता हूं, तो वे जुड़ाव नहीं होने के बारे में शिकायत करते हैं, इत्यादि। बस रखो, वे काम नहीं करते हैं।देशी एंड्रॉइड बाइनरी को संकलित करना चाहते हैं मैं फोन पर टर्मिनल में चला सकता हूं
मेरी परिकल्पना यह है कि वे एंड्रॉइड मानक सी लाइब्रेरी से ठीक से लिंक नहीं कर रहे हैं। भले ही मैं एनडीके द्वारा प्रदान की गई libc के साथ अपनी बाइनरी को जोड़ रहा हूं, फिर भी वे काम नहीं करते हैं। मैंने पढ़ा है कि एंड्रॉइड बायोनिक सी लाइब्रेरी का उपयोग करता है, और इसके लिए स्रोत डाउनलोड करने का प्रयास करता है, लेकिन मुझे यकीन नहीं है कि इससे लाइब्रेरी कैसे बनाएं (यह सभी एआरएम असेंबली है, ऐसा लगता है)।
क्या यह सच है कि फोन पर एंड्रॉइड सी लाइब्रेरी एंड्रॉइड एनडीके के साथ प्रदान किए गए एक से अलग है? क्या एनडीके के साथ शामिल कोई मुझे देशी बाइनरी संकलित करने की इजाजत नहीं देता है जिसे मैं टर्मिनल के माध्यम से निष्पादित कर सकता हूं? यहां कोई मार्गदर्शन बहुत सराहना की है!
अद्यतन:
मैं अंत में यह मैक ओएस एक्स पर जीसीसी 4.7.0 का उपयोग कर रहा बायोनिक हेडर डाउनलोड किया और फिर एक गतिशील रूप से जुड़े हुए द्विआधारी सी पुस्तकालय है कि एंड्रॉयड NDK के साथ आता है का उपयोग कर संकलित काम मिल गया । मैं फोन के सी lib (द्विआधारी 33K था) का उपयोग कर फोन पर काम करने के लिए एक टेस्ट ऐप प्राप्त करने में सक्षम था। मैंने एनडीके की सी पुस्तकालय के खिलाफ स्थाई रूप से लिंक करने की भी कोशिश की, और यह भी काम किया।
यह सब काम करने के लिए मुझे जीसीसी में नोस्टडलिब पास करना पड़ा और फिर मैन्युअल रूप से crtbegin_dynamic.o और crtend_android.o को जीसीसी की कमांड लाइन में जोड़ना पड़ा। यह इस तरह कुछ काम करता है:
$CC \
$NDK_PATH/usr/lib/crtbegin_dynamic.o \
hello.c -o hello \
$CFLAGS \
$NDK_PATH/usr/lib/crtend_android.o
स्थिर बाइनरी के लिए, "crtbegin_static.o" का उपयोग करें। यह crtbegin_dynamic.S/crtbegin_static.S स्रोत में समझाया गया है।
इस प्रयोग के लिए, मैंने केवल सादा 'ओएल जीसीसी 4.7.0 और बिनुटिल्स 2.22 का उपयोग किया। मैंने जीसीसी को न्यूलिब के साथ भी संकलित किया, लेकिन मैं वास्तव में अपने एआरएम बाइनरी को न्यूलिब के साथ जोड़ नहीं रहा हूं। मैं जीसीसी/एलडी को सीधे एंड्रॉइड एनडीके के साथ प्रदान किए गए libc से लिंक करने के लिए मजबूर कर रहा हूं, या गतिशील बाइनरी के मामले में, फोन पर libc पर।
FYI करें, यदि आप एक निर्माण की स्थापना के रूप में यदि आप एक JNI पुस्तकालय बना रहे थे (NDK वितरण में उदाहरण देखें) और करने के लिए Android.mk में BUILD_SHARED_LIBRARY बदल BUILD_EXECUTABLE आपको निष्पादन योग्य मिलेगा, हालांकि यह एनडीके बिल्ड सिस्टम की एक अनौपचारिक (दूर जा सकती है, आदि) सुविधा है। –
संभावित डुप्लिकेट [मैं एंड्रॉइड शैल से एंड्रॉइड में सी बाइनरी (निष्पादन योग्य फ़ाइल) कैसे चला सकता हूं] (http://stackoverflow.com/questions/9868309/how-can-i-run-c-binary-executable-file- इन-एंड्रॉइड-से-एंड्रॉइड-शैल) –