2012-05-29 12 views
27

मैं एक मूल एआरएम एंड्रॉइड बाइनरी संकलित करने के लिए कुछ दिनों की कोशिश कर रहा हूं जो टर्मिनल एप्लिकेशन का उपयोग करके मेरे फोन पर निष्पादित करेगा। मैं एलएस, एमकेडीआईआर आदि जैसे फोन पर मानक पॉज़िक्स बाइनरी के रूप में एक ही प्रकार की बाइनरी उत्पन्न करना चाहता हूं। मैंने मैक ओएस एक्स के तहत एंड्रॉइड एनडीके डाउनलोड किया है और त्रुटियों के बिना सरल ईएलएफ बाइनरी को संकलित करने में सक्षम हूं। हालांकि, जब मैं उन्हें फोन पर स्थानांतरित करता हूं, तो वे हमेशा सेगफॉल्ट करते हैं। यही है, जब वे जीसीसी में स्टेटिक के साथ संकलित करते हैं तो वे 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 पर।

+0

FYI करें, यदि आप एक निर्माण की स्थापना के रूप में यदि आप एक JNI पुस्तकालय बना रहे थे (NDK वितरण में उदाहरण देखें) और करने के लिए Android.mk में BUILD_SHARED_LIBRARY बदल BUILD_EXECUTABLE आपको निष्पादन योग्य मिलेगा, हालांकि यह एनडीके बिल्ड सिस्टम की एक अनौपचारिक (दूर जा सकती है, आदि) सुविधा है। –

+0

संभावित डुप्लिकेट [मैं एंड्रॉइड शैल से एंड्रॉइड में सी बाइनरी (निष्पादन योग्य फ़ाइल) कैसे चला सकता हूं] (http://stackoverflow.com/questions/9868309/how-can-i-run-c-binary-executable-file- इन-एंड्रॉइड-से-एंड्रॉइड-शैल) –

उत्तर

18

बस एंड्रॉइड-एनएनडी का उपयोग करें।और इस तरह एक एंड्रॉइड.एमके बनाएँ।

http://developer.android.com/tools/sdk/ndk/index.html

यहाँ है: include $(BUILD_EXECUTABLE) क्या यह एक निष्पादन योग्य बनाने के एक JNI के बजाय उदारीकरण

Android.mk

ifneq ($(TARGET_SIMULATOR),true) 

LOCAL_PATH:= $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_CFLAGS += -Wall 


LOCAL_LDLIBS := -L$(LOCAL_PATH)/lib -llog -g 

LOCAL_C_INCLUDES := bionic 
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include 

LOCAL_SRC_FILES:= main.cpp 

LOCAL_MODULE := mycmd 

include $(BUILD_EXECUTABLE) 

endif # TARGET_SIMULATOR != true 
+0

यह मेरे लिए समाधान था। मैंने सफलता के बिना agcc के साथ tinkering किया है। ऐसा लगता है कि एंड्रॉइड बिल्ड सिस्टम का लाभ उठाता है ... क्या यह कुछ स्पष्टीकरण है कि यह कहीं कैसे काम करता है? धन्यवाद! –

+0

$ (एनडीके_आरओटी)/डॉक्स /ANDROID-MK.html वर्णन करता है कि सभी मैक्रोज़ क्या हैं। – SonicBison

+0

एक अतिरिक्त 'endif' – dashesy

0

कोशिश करें कि agcc wrapperAndroid-tricks ब्लॉग में संदर्भित आपकी सहायता कर सकता है या नहीं। ब्लॉग पोस्ट के अनुसार आप बायोनिक लाइब्रेरी का उपयोग करना चाहते हैं, लेकिन पहले से ही पर स्थापित है, कुछ अलग संकलित संस्करण नहीं।

+0

http://www.crystax.net/android/ndk-r3.php <- का उपयोग भी हो सकता है –

+0

आधिकारिक एनडीके के बजाय इस मामले में क्रिस्टैक्स का उपयोग क्यों करें? –

+0

कोई विशेष कारण नहीं है, कभी-कभी यह प्रयोग और सीखने के दौरान अलग-अलग चीजों को आजमाने में मदद करता है। यही कारण है कि मैंने अभी इसे एक टिप्पणी की है। –

3

एंड्रॉइड एनडीके के साथ सीएमके का उपयोग करना एंड्रॉइड कंसोल अनुप्रयोगों को संकलित करने का एक अच्छा तरीका है।

CMake और android-cmake डाउनलोड करें (इसे like this सेट करें)। अपने कार्यक्रम main.c कहा जाता है, तो फ़ाइल CMakeLists.txt में निम्नलिखित लिखें:

project(test) 
cmake_minimum_required(VERSION 2.8) 
add_executable(test ./main.c) 

और चलाने cmake -DCMAKE_TOOLCHAIN_FILE=$ANDTOOLCHAIN .

तब आप अपने कार्यक्रम के लिए एक Makefile होगा, आप अपने test निष्पादन के लिए make चला सकते हैं ।

14

सबसे पहले, सुनिश्चित करें कि आपके NDK बताता है अपने फोन के लिए सी बाइनरी संकलित करने का सबसे आसान तरीका:

http://developer.android.com/tools/sdk/ndk/index.html

http://www.kandroid.org/ndk/docs/STANDALONE-TOOLCHAIN.html

आमतौर पर $ NDK (अलग हो सकता है) =

लिनक्स:

/घर/<user>/android-NDK

मैक ओएस एक्स:

/उपयोगकर्ता/<user>/एंड्रो आईडी-NDK

टर्मिनल में:

# create tool-chain - one line 
# New method in ndk 12. 
$NDK/build/tools/make_standalone_toolchain.py --arch arm --install-dir=/tmp/my-android-toolchain 
# Old method. 
#$NDK/build/tools/make-standalone-toolchain.sh --platform=android-3 --install-dir=/tmp/my-android-toolchain 

# add to terminal PATH variable 
export PATH=/tmp/my-android-toolchain/bin:$PATH 

# make alias CC be the new gcc binary 
export CC=arm-linux-androideabi-gcc 

# compile your C code(I tried hello world) 
$CC -o foo.o -c foo.c 

# push binary to phone 
adb push foo.o /data/local/tmp 

# execute binary 
adb /data/local/tmp/foo.o 
+0

... क्या आप * ऑब्जेक्ट फ़ाइल * निष्पादित कर रहे हैं? इसे जोड़ने के बिना? क्या यह वास्तव में काम करता है? –

+1

हाँ ऐसा लगता है। मुझे सबसे अधिक संभावना '-c' को हटाने की आवश्यकता है। मैंने इसे कुछ समय पहले लिखा था। –