2012-07-04 12 views
6

Próbuję przenieść libCurl do Androida z obsługą SSL, krokiem pierwszym byłoby przeniesienie curl bez obsługi ssl, więc chyba zacząłem to robić. ale mam problem.przenoszenie libcurl na Androida z obsługą ssl

Tak jak czytałem na stronie internetowej dev oraz w pliku Android.mk, trudniej jest najpierw skonfigurować markę. więc co zrobiłem to:

  1. Pobierz Android kod źródłowy (! i skompilować go, ponieważ niektóre z pośrednich bibliotekami są potrzebne)

  2. Pobierz cURL

  3. rozpakować curl pod: {android_src}/external/curl

  4. utworzyć skrypt konfiguracyjny dla zwijania, tworząc plik sh w folderze zewnętrznym/folderze z tą zawartością.

`

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 

` I Podsumowanie wyjściowa jest taka:

configure: przystosowany do budowania curl/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. 

Pierwszą dziwną rzeczą, która przychodzi należy pamiętać, dlaczego protokół SSL nie jest zawarty w konfiguracji, ponieważ linker pokazuje bibliotekę pośrednią Wywoływana jest flaga wsparcia ss i ssl, ale po użyciu tego samego pliku curl_config.h w projekcie jni, który utworzyłem dla kompilacji (ponieważ ma on samodzielny plik Android.mk, można go skompilować poprzez proste rozpakowanie w folderze jni z android projektu, kopiując plik konfiguracyjny utworzony w AOSP źródła i nazywając NDK-build)

więc skompilować i uzyskać:

$ 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 

Odpowiedz

13

Oto rozwiązanie, zaktualizowana NDK8c

step zero: pobierz i napraw Android NDK Nie wiem jak, ale e ndk ma bardzo interesującą wadę, która (w mojej opozycji) nie pozwala na kompilację wielu rzeczy, więc aby móc skompilować OpenSSL, musisz zrobić małą poprawkę, wyodrębnić ndk8c wszędzie tam, gdzie przechowujesz swoje narzędzia, i następnie edytować plik: Android NDK-8C/build/gmsl/__ gmsl linia 512: linia zmiana

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

z linii

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

i jesteś dobry, aby przejść!

krok jeden: Pobierz OpenSSL i kompilacji dla Androida: albo skompilować przeniesiony wersja znaleźć here lub Pobierz oficjalny 1.0.Wersja 0c OpenSSL, a następnie skompilować go do android korzystania z instrukcji zawartych w github I połączone dla Androida kompatybilnej wersji

więc następnym krokiem jest uzyskanie libssl.so i libcrypto.so i umieścić je w folderze NDK dla łatwego dostępu, aby skopiować je z

openssl-folder/libs/armeabi/ 

do

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

ten sposób podczas kompilacji yo u mogą zawierać bibliotekami za pomocą prostego przełącznika łącznik -lssl -lcrypto

Krok dwa: uzyskać najnowsze źródła Curl za here

otworzyć plik w Dokumentach/INSTALL i wykonaj kroki potrzebne do autonomicznego toolchain i umieścić w twoim pożądanym folderze, a następnie podstępną część, potrzebowałem mieć kod źródłowy Androida, aby konfiguracja mogła być kontynuowana, mimo że mam samodzielny skompilowany openssl możesz dołączyć pliki nagłówkowe również tam, w anycase jest to bardziej skomplikowane Wersja, aby wybrać to, co robisz, nie zdecydowałem się ich ominąć, więc możesz przejść do Google AOSP site i przejść przez kroki do bui ld i zainicjalizuj środowisko.

więc byłoby coś takiego:

1.download,

  1. przejść do katalogu głównego kodu źródłowego i uruchomić:

    ~: Build/envsetup.sh; obiad 1; robić;

Więc w końcu musimy skompilować curl z obsługą SSL, więc

Krok trzeci

ekstrakt curl do żądanego folderu (Mam konkretne pragnienie wyłączając wszystko oprócz http/s, aby biblioteka była tak mała, jak to możliwe, około ~ 300k, jeśli chcesz mieć więcej protokołów w swojej bibliotece, usuń --disable-protokół dla żądanego protokołu) uruchom następujące:

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. 

Więc w końcu masz: statyczny:

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

i wspólne:

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

Więc to tak .. Weź plik i skompilować z dala :)

+0

Wielkie dzięki za pracę. Wziąłem twoją radę, ale zamiast pełnego sdk użyłem tylko samodzielnego toochaina, jak zalecono w przewodniku instalacji cURL. Następnie skopiowałem nagłówki openssl i pliki .so do folderów w toolchain i odpowiednio ustawiono LDFLAGS i CPPFLAGS. Prosta - z-ssl zrobiła sztuczkę, gdy raz ustawiono ją poprawnie. Więc na przyszłość: nie musisz korzystać z pełnego zestawu SDK systemu Android, możliwe jest również udostępnienie zestawu narzędzi. – domenukk

+0

tak jest teraz, dwa + lata temu nie było możliwe do kompilacji poza AOSP – Tancho

+0

Musiałem zmodyfikować polecenia tutaj na http://pastebin.com/qzxzc592 nie jestem pewien, czy jest to potrzebne dla wszystkich, ale – ruler501

0

kroki dla Kompilowanie libcurl.so z obsługą ssl dla Androida jni można znaleźć tutaj: http://ieroot.com/2015/03/29/1728.html

Przez tydzień walczyłem o to.

Zadaj pytanie.Odpowiem tak szybko, jak to możliwe.

+0

Link nie działa – Tancho

+0

Próbowałem już teraz i działało. Być może, spróbuj ponownie. Skontaktuj się ze mną, jeśli nadal nie możesz się połączyć. –

1

Podoba mi się sposób użycia Dockera do budowania takich statycznych bibliotek. Tutaj jest pełny skrypt - wystarczy uruchomić go i pobrać wynik. Próbka: https://gist.github.com/VictorLaskin/1c45245d4cdeab033956

Taki scenariusz będzie:

  • kompilacja konfiguracja narzędzia/utils Pobierz SDK/NDK
  • utworzyć niestandardowy kod źródłowy toolchain pobierania cross-kompilacji dla libs (zlib, openssl, curl)
  • konfiguracja ustawień środowiska do kompilacji krzyżowej
  • konfigurowanie i tworzenie bibliotek
  • gromadzenie danych wyjściowych w jednym folderze i tworzenie sposobu uzyskiwania skompilowanych bibliotek:

W tej konkretnej wersji wykorzystano najnowsze narzędzie NDK 10e i narzędzie klangowe.

Jest po więcej szczegółów tutaj: http://vitiy.info/dockerfile-example-to-compile-libcurl-for-android-inside-docker-container/

Mam nadzieję, że to pomoże ktoś nie tracić cennego czasu.

Powiązane problemy