2012-07-04 21 views
6

के साथ एंड्रॉइड पर libcurl पोर्टिंग मैं एसएसएल समर्थन के साथ एंड्रॉइड में libCurl पोर्ट करने की कोशिश कर रहा हूं, चरण एक एसएसएल समर्थन के बिना कर्ल बंदरगाह होगा, मुझे लगता है कि मैंने ऐसा करना शुरू कर दिया। लेकिन मैं एक समस्या में भाग गया।एसएसएल समर्थन

के रूप में मैं देव वेबसाइट पर और Android.mk फ़ाइल में पढ़ा है, कठिन हिस्सा पहले मेकअप को विन्यस्त कर रहा है। तो क्या मैंने किया है:

  1. डाउनलोड एंड्रॉयड स्रोत कोड (! और यह संकलन के बाद से मध्यवर्ती libs में से कुछ की जरूरत है)

  2. डाउनलोड cURL

  3. खोल कर्ल के तहत: {} android_src/बाहरी/कर्ल

  4. इस सामग्री के साथ बाहरी/कर्ल फ़ोल्डर में एक श फ़ाइल बनाने के द्वारा कर्ल के लिए कॉन्फ़िगर स्क्रिप्ट बनाते हैं।

    कॉन्फ़िगर:

    curl version:  7.26.0 
        Host setup:  arm-unknown-eabi 
        Install prefix: /usr/local 
        Compiler:   /home/tanco/Development/AOSP/2.3.3/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-gcc 
        SSL support:  no  (--with-{ssl,gnutls,nss,polarssl,cyassl,axtls}) 
        SSH support:  no  (--with-libssh2) 
        zlib support:  enabled 
        krb4 support:  no  (--with-krb4*) 
        GSSAPI support: no  (--with-gssapi) 
        SPNEGO support: no  (--with-spnego) 
        TLS-SRP support: no  (--enable-tls-srp) 
        resolver:   default (--enable-ares/--enable-threaded-resolver) 
        ipv6 support:  no  (--enable-ipv6) 
        IDN support:  no  (--with-libidn) 
        Build libcurl: Shared=no, Static=yes 
        Built-in manual: enabled 
        --libcurl option: enabled (--disable-libcurl-option) 
        Verbose errors: enabled (--disable-verbose) 
        SSPI support:  no  (--enable-sspi) 
        ca cert bundle: /etc/ssl/certs/ca-certificates.crt 
        ca cert path:  no 
        LDAP support:  no  (--enable-ldap/--with-ldap-lib/--with-lber-lib) 
        LDAPS support: no  (--enable-ldaps) 
        RTSP support:  enabled 
        RTMP support:  no  (--with-librtmp) 
        Protocols:  DICT FILE FTP GOPHER HTTP IMAP POP3 RTSP SMTP TELNET TFTP 
    
        SONAME bump:  yes - WARNING: this library will be built with the SONAME 
            number bumped due to (a detected) ABI breakage. 
            See lib/README.curl_off_t for details on this. 
    

    पहले अजीब बात आता है कि: कर्ल/libcurl का निर्माण करने के लिए कॉन्फ़िगर

`

export A=/home/user/Development/AOSP/2.3.3  
export CC=$A/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-gcc 
export NDK=/home/user/Development/Tools/sdk/android/ndk 
export NDKLIBS=$NDK/platforms/android-4/arch-arm/usr/include 
export SYSROOT=$A/ndk/build/platforms/android-4/arch-arm 
export CPPFLAGS="-I $A/system/core/include" 
export LDFLAGS="-L$A/out/target/product/generic/obj/lib/ -L$A/out/target/product/generic/system/lib/-L$SYSROOT/usr/lib -Wl,--gc-sections -nostdlib -lc -lm -ldl -llog -lgcc -Wl,--no-undefined,-z,nocopyreloc -Wl,-dynamic-linker,/system/bin/linker -L$NDK/out/target/product/generic/obj/lib/" 
export CFLAGS="-fno-exceptions -Wno-multichar -mthumb -mthumb-interwork -nostdlib -lc -ldl -lm -march=armv5te -mtune=xscale -msoft-float -mandroid -fPIC -mthumb-interwork -mthumb -mlong-calls -ffunction-sections -fstack-protector -fno-short-enums -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -DANDROID -DOS_ANDROID -D__NEW__ -D__SGI_STL_INTERNAL_PAIR_H -I$SYSROOT/usr/include -I $A/system/core/include -I $NDKLIBS" 

./configure --host=arm-eabi --with-ssl=$A/external/openssl 

` और उत्पादन सारांश यह एक है दिमाग में एसएसएल कॉन्फ़िगरेशन में शामिल क्यों नहीं है क्योंकि लिंकर मध्यवर्ती lib को दिखाता है एस और एसएसएल समर्थन ध्वज कहा जाता है, लेकिन जब मैं निर्माण के लिए बनाई गई जेनी प्रोजेक्ट में उसी curl_config.h फ़ाइल का उपयोग करता हूं (क्योंकि इसमें एक स्टैंडअलोन एंड्रॉइड.एमके फ़ाइल है, तो इसे आसानी से जेनी फ़ोल्डर में अनजिप करके संकलित किया जा सकता है एक एंड्रॉयड परियोजना की, AOSP स्रोत में बनाया कॉन्फ़िग फ़ाइल को कॉपी करने और बुला NDK-निर्माण)

तो मैं संकलन और मैं:

$ ndk-build 
Compile thumb : curl <= url.c 
In file included from /Projects/temp/testNDK/jni/lib/url.c:32:0: 
/Tools/sdk/android/ndk/platforms/android-14/arch-arm/usr/include/unistd.h: In function 'getpagesize': 
/Tools/sdk/android/ndk/platforms/android-14/arch-arm/usr/include/unistd.h:171:3: warning: nested extern declaration of '__page_size' [-Wnested-externs] 
/Tools/sdk/android/ndk/platforms/android-14/arch-arm/usr/include/unistd.h: In function '__getpageshift': 
/Tools/sdk/android/ndk/platforms/android-14/arch-arm/usr/include/unistd.h:175:3: warning: nested extern declaration of '__page_shift' [-Wnested-externs] 
/Projects/temp/testNDK/jni/lib/url.c: At top level: 
/Projects/temp/testNDK/jni/lib/url.c:57:2: error: #error "We can't compile without socket() support!" 
make: *** [/Projects/temp/testNDK/obj/local/armeabi/objs/curl/lib/url.o] Error 1 

उत्तर

13

यहाँ समाधान, NDK8c

को

अद्यतन है चरण शून्य: एंड्रॉइड एनडीके डाउनलोड करें और ठीक करें मुझे पता नहीं कि कैसे लेकिन ई ndk में एक बहुत ही रोचक दोष है, जो (मेरे विरोध में) आपको बहुत सारी चीजों को संकलित करने की अनुमति नहीं देता है, इसलिए ओपनएसएसएल को संकलित करने में सक्षम होने के लिए आपको एक छोटा फिक्स बनाने की आवश्यकता है, ndk8c whereever निकालें जो आप अपने उपकरण रखते हैं, और तब फ़ाइल को संपादित: android-NDK-R8C/निर्माण/gmsl/__ gmsl लाइन 512: परिवर्तन लाइन

int_encode = $(__gmsl_tr1)$(wordlist 1,$1,$(__gmsl_input_int)) 

लाइन

int_encode = $(__gmsl_tr1)$(wordlist 1,$(words $1),$(__gmsl_input_int)) 

साथ और तुम जाने के लिए अच्छा कर रहे हैं!

कदम एक: OpenSSL डाउनलोड करें और Android के लिए संकलन: या तो संकलन एक पोर्टेड संस्करण here पाया या डाउनलोड आधिकारिक 1.0।OpenSSL के 0C संस्करण और फिर GitHub मैं एंड्रॉयड संगत संस्करण

तो अगले कदम के libssl.so और libcrypto.so हो और डाल करने के लिए है के लिए जुड़ा हुआ में प्रदान की पुस्तिका का उपयोग करके android के लिए यह संकलन आसान पहुँच के लिए NDK फ़ोल्डर में उन्हें है, तो इस तरह से

android-ndk-r8c/platforms/android-8/arch-arm/usr/lib 

करने से

openssl-folder/libs/armeabi/ 

उन्हें कॉपी जब संकलन यो यू एक सरल लिंकर स्विच का उपयोग libs शामिल कर सकते हैं -lssl -lcrypto

चरण दो: डॉक्स में के लिए here

ओपन फाइल कर्ल के नवीनतम स्रोत मिल/इन्सटाल और कदम स्टैंडअलोन toolchain बनाने के लिए आवश्यक का पालन करें और अपने वांछित फ़ोल्डर में डाल दिया, और फिर मुश्किल हिस्सा, मुझे कॉन्फ़िगरेशन के लिए एंड्रॉइड के स्रोत कोड की आवश्यकता होती है, भले ही मेरे पास एक स्टैंडअलोन संकलित ओपनएसएल है, आप किसी भी प्रकार में हेडर फाइलों को भी शामिल कर सकते हैं, यह अधिक जटिल है संस्करण ताकि आप चुन सकें कि आप क्या करते हैं, मैंने उन्हें बचाना नहीं चुना ताकि आप Google AOSP site पर जा सकें और bui के लिए कदम उठा सकें एलडी और पर्यावरण शुरू करें।

तो यह की तरह कुछ होगा:

1.download,

  1. स्रोत कोड की जड़ तक जाने के लिए और चलाएँ:

    ~: निर्माण/envsetup.sh; दोपहर का भोजन 1; बनाना;

तो अंत में हम एसएसएल समर्थन के साथ कर्ल संकलन करने की जरूरत है, इसलिए,

चरण इच्छित फ़ोल्डर करने के लिए तीन

निकालने कर्ल (मैं http के अलावा सब कुछ को निष्क्रिय करने के लिए एक विशेष इच्छा है पुस्तकालय को ~ 300k जितना संभव हो उतना छोटा रखने के लिए, यदि आप अपने lib में अधिक प्रोटोकॉल चाहते हैं, तो वांछित प्रोटोकॉल के लिए - अक्षम करने योग्य प्रोटोकॉल को हटाएं) निम्न चलाएं:

make clean 

export PATH=/opt/arm-linux-androideabi-4.4.3/bin:$PATH 

export LDFLAGS="\ 
-lssl \ 
-lcrypto \ 
-L/home/user/Development/Tools/sdk/android/ndk/platforms/android-8/arch-arm/usr/lib" 

export CFLAGS="\ 
-I/home/user/Development/AOSP/2.3.7/system/core/include \ 
-I/home/user/Development/Tools/sdk/android/ndk/platforms/android-8/arch-arm/usr/include" 

./configure --host=arm-linux-androideabi \ 
--with-ssl=/home/user/Development/Projects/portingLibs/openssl-android-master \ 
--disable-ftp \ 
--disable-gopher \ 
--disable-file \ 
--disable-imap \ 
--disable-ldap \ 
--disable-ldaps \ 
--disable-pop3 \ 
--disable-proxy \ 
--disable-rtsp \ 
--disable-smtp \ 
--disable-telnet \ 
--disable-tftp \ 
--without-gnutls \ 
--without-libidn \ 
--without-librtmp \ 
--disable-dict 


make 



Note that in the block above, if you don't want to use the AOSP source, you could switch 

-I/home/user/Development/AOSP/2.3.7/system/core/include \ 

with the include folder for your ssl distribution. 

तो अंत में आप: स्थिर:

curl-7.28.1/lib/.libs/libcurl.a 

और साझा:

curl-7.28.1/lib/.libs/libcurl.so.5.3 

तो हो गया .. फ़ाइल लेते हैं, और दूर संकलन :)

के लिए
+0

आपके काम के लिए बहुत बहुत धन्यवाद। मैंने आपकी सलाह ली है लेकिन पूर्ण एसडीके की बजाय, केवल कर्नल इंस्टॉलेशन गाइड में सलाह के रूप में स्टैंडअलोन सरचेन का इस्तेमाल किया। तब मैंने ओपनस्ल हेडर और .so फ़ाइलों को टूलचेन में फ़ोल्डरों में कॉपी किया और क्रमशः एलडीएफएलजीएस और सीपीपीएफएलजीएस सेट किया। एक सरल - साथ-एसएसएल ने चाल को एक बार स्थापित किया था। तो भविष्य के संदर्भ के लिए: आपको पूर्ण एंड्रॉइड एसडीके का उपयोग करने की ज़रूरत नहीं है, टूलचैन भी एक संभावित तरीका है। – domenukk

+0

अब यह मामला है, दो + साल पहले यह एओएसपी – Tancho

+0

के बाहर संकलित नहीं था। मुझे यहां आदेशों को संशोधित करना था http://pastebin.com/qzxzc592 यह सुनिश्चित नहीं है कि – ruler501

0

कदम libcurl.so संकलन एंड्रॉइड जेनी के लिए एसएसएल समर्थन के साथ यहां पाया जा सकता है: http://ieroot.com/2015/03/29/1728.html

मैं इसे समझने के लिए एक सप्ताह तक संघर्ष कर रहा था।

कोई प्रश्न पूछें या नहीं।मैं जितनी जल्दी हो सके जवाब दूंगा।

+0

लिंक काम नहीं करता – Tancho

+0

मैंने अभी कोशिश की है और यह काम करता है। शायद, आपको फिर से प्रयास करने की आवश्यकता है। अगर अभी भी कनेक्ट नहीं हो सकता है तो मुझसे संपर्क करें। –

1

मुझे ऐसी स्थिर libs बनाने के लिए डॉकर का उपयोग करने का तरीका पसंद है। यहां पूरी स्क्रिप्ट है - आप इसे चलाएं और परिणाम लें। नमूना: https://gist.github.com/VictorLaskin/1c45245d4cdeab033956

इस तरह की स्क्रिप्ट करेंगे:

  • सेटअप संकलन उपकरण/utils एसडीके डाउनलोड करें/NDK
  • libs (zlib, openssl, कर्ल)
  • के लिए कस्टम पार संकलन toolchain डाउनलोड स्रोत कोड बनाने क्रॉस संकलन के लिए सेटअप पर्यावरण सेटिंग्स
  • कॉन्फ़िगर करें और libs
  • एक फ़ोल्डर में आउटपुट इकट्ठा करें औरप्राप्त करने का तरीका बनाएं 10 संकलित libs

यह विशिष्ट संस्करण नवीनतम एनडीके 10e और क्लैंग टूलचेन का उपयोग कर रहा है।

अधिक जानकारी के लिए यहाँ के साथ पोस्ट नहीं है: http://vitiy.info/dockerfile-example-to-compile-libcurl-for-android-inside-docker-container/

मुझे आशा है कि यह मदद मिलेगी कोई कीमती समय बर्बाद मत करने के लिए।