2012-07-04 4 views
6

libCurl을 SSL 지원으로 안드로이드에 포팅하려고합니다. 1 단계는 ssl 지원없이 컬링을 포팅하는 것입니다. 하지만 문제가 생겼어.libcurl with ssl support

dev 웹 사이트 및 Android.mk 파일에서 읽은 것처럼 어려운 부분은 먼저 make를 구성합니다. 그래서 내가 한 것은 :

  1. 다운로드 안드로이드 소스 코드 (! 중간 libs와 일부 필요하기 때문에 컴파일)

  2. 다운로드 컬

  3. 압축을 풀고 컬 미만 : {android_src}/external/curl

  4. 이 내용으로 외부/curl 폴더에 sh 파일을 작성하여 curl에 대한 configure 스크립트를 작성하십시오.

    구성 : 제공

    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를 보여주기 때문에 SSL이 config에 포함되지 않는 이유는 무엇입니까? s 및 ssl 지원 플래그가 호출되었지만 빌드를 위해 만든 jni 프로젝트에서 동일한 curl_config.h 파일을 사용한 후에 (독립 실행 형 Android.mk 파일이 있기 때문에 jni 폴더에서 압축을 풀면 간단히 컴파일 될 수 있습니다 안드로이드 프로젝트의 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

에 업데이트 된 솔루션입니다 0 단계 : Android NDK를 다운로드하여 수정하십시오. 나는 어떻게해야 하나? e ndk에는 매우 흥미로운 결함이 있습니다. (내 의견으로는) 많은 것들을 컴파일하는 것을 허용하지 않기 때문에, OpenSSL을 컴파일 할 수 있으려면 작은 수정을하고 ndk8c를 추출해야하며 도구를 유지해야합니다. 안드로이드 NDK-R8C/빌드/GMSL/__ GMSL 라인 512 : 변화 라인 라인

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

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

그리고 당신은 갈 수 있어요 다음 파일을 편집!

단계 한 : OpenSSL을 다운로드 및 안드로이드에 대한 컴파일 를하거나 컴파일 이식 된 버전은 here 을 발견하거나 공식 1.0을 다운로드합니다.다음 0 ℃에서의 OpenSSL 버전과 내가 안드로이드 호환 버전

그래서 다음 단계는 libcrypto.so libssl.so 을 얻고 넣어하는 것입니다에 대한 링크 GitHub의에서 제공하는 설명서를 사용하여 안드로이드에 대한 컴파일 컴파일 할 때 쉽게 액세스 할 수 NDK 폴더에있는 그들, 그래서는

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

openssl-folder/libs/armeabi/ 

에서이 방법을 복사 요 u는 간단한 링커 스위치를 사용하여 libs와 포함 할 수 -lssl -lcrypto

2 단계 : INSTALL/문서 도구에서 here

을 열고 파일을 컬의 최신 소스를 얻을 독립 툴체인을 만드는 데 필요한 단계를 수행하고 원하는 폴더에 넣고 까다로운 부분을 넣으려면 config에 대한 안드로이드 소스 코드가 있어야합니다. 독립 실행 형 컴파일 된 openssl이 있어도 헤더 파일을 include 할 수 있습니다. 버전 그래서 당신은 당신이 무엇을 선택할지, 나는 당신이 Google AOSP site에 갈 수 있고, 물마루가 bui에 단계를 참을 수있을 정도로 그들을 피하기로 결심하지 않았다 환경을 초기화하고 초기화하십시오.

  1. 소스 코드의 루트로 이동 실행

    1.download :

    그래서 뭔가를 것

    ~ :/envsetup.sh를 구축; 점심 1; 하다;

그래서 결국 우리는 (내가 HTTP를 제외한 모든 해제의 특정 욕망이 세

추출물 컬 원하는 폴더 에

단계, SSL 지원 컬 컴파일 할 필요가 있으므로/s 라이브러리를 가능한 한 작게 ~ 300k 정도로 유지하려면 lib에 더 많은 프로토콜을 원할 경우 원하는 프로토콜에 대해 --disable-protocol을 제거하십시오.

정적 :

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

및 공유 :

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.so.5.3 

그래서 그것 뿐이다을 ... 파일을, 그리고 :)

+0

감사합니다. 귀하의 조언을 구했지만 full sdk 대신 cURL 설치 안내서에 나와있는 독립형 toochain 만 사용했습니다. 그런 다음 openssl 헤더와 .so 파일을 툴체인의 폴더에 복사하고 각각 LDFLAGS와 CPPFLAGS를 설정했습니다. 단순한 --with-ssl은 일단 트릭을 만들었습니다. 따라서 향후 참조를 위해 : 전체 Android SDK를 사용할 필요가 없으며 툴체인도 가능한 방법입니다. – domenukk

+0

이제 2 년전에 AOSP 외부에서 편집 할 수 없었습니다 – Tancho

+0

여기에 명령을 수정해야만했는데 http://pastebin.com/qzxzc592는 모두에게 필요한지 확실하지 않습니다. – ruler501

0

단계에 대한 멀리 컴파일 libcurl.so를 ssl with android jni로 컴파일하면 여기에서 찾을 수 있습니다 : http://ieroot.com/2015/03/29/1728.html

나는 그것을 알아 내기 위해 일주일 동안 고생했다.

질문이 있으면 질문하십시오.최대한 빨리 회신하겠습니다.

+0

링크가 작동하지 않습니다. – Tancho

+0

방금 ​​시도한 결과 제대로 작동합니다. 어쩌면 다시 시도해야합니다. 여전히 연결할 수 없다면 저에게 연락하십시오. –

1

Docker를 정적 라이브러리로 사용하는 방법을 좋아합니다. 여기에 전체 스크립트가 있습니다 - 당신은 그것을 실행하고 결과를 잡아. 샘플 : https://gist.github.com/VictorLaskin/1c45245d4cdeab033956

이러한 스크립트 것입니다 :

  • 설정 편집 툴/유틸 다운로드 SDK/NDK
  • libs와 (ZLIB,하려면 openssl, 컬)
  • 에 대한 사용자 정의 크로스 컴파일 툴체인 다운로드 소스 코드를 생성 교차 컴파일을위한 환경 설정 구성
  • 구성 및 라이브러리 구성
  • 출력을 하나의 폴더에 수집하고를 얻는 방법을 만듭니다. 10 개의 컴파일 된 라이브러리

이 특정 버전은 최신 NDK 10e 및 clang 툴 체인을 사용합니다.

여기에 자세한 내용은 포스트있다 :이 사람이 귀중한 시간을 낭비하지하는 데 도움이 될 것입니다 희망 http://vitiy.info/dockerfile-example-to-compile-libcurl-for-android-inside-docker-container/

가.