2012-07-04 94 views
6

我正嘗試使用SSL支持移植libCurl到android, 第一步是在沒有ssl支持的情況下移植curl我想所以我開始這樣做。但我遇到了一個問題。在android上使用ssl支持移植libcurl

,因爲我在開發網站,並在Android.mk文件中讀取,最困難的部分是第一次配置廠名。所以我所做的是:

  1. 下載Android的源代碼(!並編譯它,因爲一些中間庫的需要)

  2. 下載捲曲

  3. 解壓卷曲下:{android_src} /外部/捲曲

  4. 通過創建外部/捲曲文件夾中的文件的sh與此內容做出捲曲的配置腳本。

`

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 

` 和輸出總結是這樣的一個:

配置:配置打造捲曲/ libcurl中:

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. 

首先奇怪的是自帶的事要注意的是,爲什麼SSL不包含在配置中,因爲鏈接器向中間庫顯示s和ssl支持標誌被調用,但是在我爲構建創建的jni項目中使用相同的curl_config.h文件後(因爲它具有獨立的Android.mk文件,所以只需在jni文件夾中解壓即可編譯它)一個Android項目的,複製在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

步零:下載並修復了Android NDK 我不知道怎麼樣,但日e ndk有一個非常有趣的缺陷,它(在我的看法中)不允許你編譯很多東西,所以爲了能夠編譯OpenSSL,你需要做一個小的修復,在你保存工具的時候提取ndk8c,以及然後編輯該文件: 的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版本:0​​要麼編譯移植版本中發現here 或下載的官方1.0。OpenSSL的0℃至版本,然後用我聯繫爲Android兼容版本

因此,下一步是讓libssl.solibcrypto.so 並把github上提供的手動編譯爲Android在編譯時,他們爲方便NDK的文件夾,所以從

openssl-folder/libs/armeabi/ 

將它們複製到

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

這樣喲ü可以用一個簡單的鏈接器開關包括庫-lssl -lcrypto

第二步:獲得捲曲的最新源here

打開文件文檔/安裝,然後做出獨立的工具鏈所需的步驟和放在你想要的文件夾中,然後是棘手的部分,我需要讓android的源代碼繼續配置,即使我有一個獨立編譯的openssl,你也可以從那裏包含頭文件,在任何情況下,這是更復雜版本,所以你選擇你做什麼,我沒有選擇逃避他們,所以你可以去Google AOSP site,並通過步驟來bui ld並初始化環境。

所以它會是這樣的:

1.download,

  1. 轉到源代碼的根目錄並運行:

    〜:建/ envsetup.sh;午餐1;使;

所以最後我們需要編譯捲曲支持SSL,因此,

第三步

提取物捲曲到所需的文件夾 (我除了HTTP禁止一切的具體願望/秒,以保持庫小到約30萬〜如果你想在你的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

非常感謝您的工作。我已經採納了您的建議,而不是完整的sdk,只能在cURL安裝指南中使用獨立的toochain。然後,我將openssl頭文件和.so文件複製到工具鏈中的文件夾並分別設置LDFLAGS和CPPFLAGS。一個簡單的--with-ssl做了訣竅,一旦正確設置。因此供將來參考:您不必使用完整的Android SDK,工具鏈也是一種可行的方法。 – domenukk

+0

這是現在的情況,兩年前,它不是可編譯的AOSP – Tancho

+0

我不得不修改這裏的命令到http://pastebin.com/qzxzc592不知道是否需要爲所有人通過 – ruler501

0

步驟編譯libcurl.so以及支持android jni的ssl支持: http://ieroot.com/2015/03/29/1728.html

我拼命找了一個星期。

詢問是否有問題。我會盡快回復。

+0

鏈接不起作用 – Tancho

+0

我剛剛試過,發現它的作品。也許,你需要再試一次。如果仍然無法連接,請與我聯繫。 –

1

我喜歡使用Docker構建靜態庫的方式。這裏有完整的腳本 - 您只需運行它並獲取結果。示例:https://gist.github.com/VictorLaskin/1c45245d4cdeab033956

這樣的腳本:

  • 設置編譯工具/ utils的下載SDK/NDK
  • 創建自定義的交叉編譯的庫(zlib的,OpenSSL的,捲曲)
  • 工具鏈下載源代碼用於交叉編譯的設置環境設置
  • configure and make libs
  • 收集一個文件夾的輸出並創建獲取方式 個編譯庫

這種特殊的版本使用最新的NDK 10e和鏗鏘工具鏈。

有交更多的細節在這裏:http://vitiy.info/dockerfile-example-to-compile-libcurl-for-android-inside-docker-container/

我希望這會幫助別人不浪費寶貴的時間。