2012-07-04 34 views
6

Tôi đang cố gắng chuyển libCurl sang android với hỗ trợ SSL, bước một là chuyển cổng curl mà không cần hỗ trợ ssl Tôi đoán vậy nên tôi bắt đầu thực hiện điều đó. nhưng tôi gặp rắc rối.porting libcurl trên android với hỗ trợ ssl

khi tôi đọc trên trang web của nhà phát triển và trong tệp Android.mk, phần khó khăn là định cấu hình thực hiện trước. vì vậy những gì tôi đã làm là:

  1. Tải về Android Source code (! và biên dịch nó kể từ một số các libs trung gian là cần thiết)

  2. Tải cURL

  3. unpack curl dưới: {android_src}/external/curl

  4. tạo tập lệnh cấu hình để cuộn tròn bằng cách tạo tệp sh trong thư mục bên ngoài/thư mục có nội dung này.

'

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 

' Và tóm tắt đầu ra là cái này:

cấu hình: Cấu hình để xây dựng 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. 

điều lạ đầu tiên mà đến để nhớ là tại sao SSL không được bao gồm trong cấu hình kể từ khi trình liên kết hiển thị cho lib trung gian s và hỗ trợ ssl cờ được gọi, nhưng sau khi tôi sử dụng cùng một tập tin curl_config.h trong dự án jni mà tôi tạo cho xây dựng (vì nó có một tập tin Android.mk độc lập nó có thể được biên dịch đơn giản bằng cách giải nén trong thư mục jni của một dự án android, sao chép các tập tin cấu hình được tạo ra trong nguồn AOSP và gọi ndk-build)

vì vậy tôi biên dịch và tôi nhận được:

$ 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 

Trả lời

13

Dưới đây là giải pháp, cập nhật để NDK8c

bước số không: tải xuống và sửa chữa Android NDK Tôi không biết cách e ndk có một lỗ hổng rất thú vị, cái mà (trong ý kiến ​​của tôi) không cho phép bạn biên dịch nhiều thứ, để có thể biên dịch OpenSSL, bạn cần sửa một chút, trích xuất ndk8c bất cứ nơi nào bạn giữ công cụ của mình, và sau đó chỉnh sửa các tập tin: android-ndk-r8c/build/gmsl/__ gmsl dòng 512: thay đổi dòng

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

với dòng

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

Và bạn tốt để đi!

bước một: Tải OpenSSL và biên dịch dành cho Android: hoặc biên dịch một phiên bản được chuyển phát here hoặc tải chính thức 1.0.phiên bản 0c OpenSSL và sau đó biên dịch nó cho android sử dụng hướng dẫn được cung cấp trong github tôi liên kết với các phiên bản tương thích Android

Vì vậy, bước tiếp theo là để có được những libssl.solibcrypto.so và đặt các chúng trong thư mục NDK để dễ dàng truy cập, vì vậy hãy copy chúng từ

openssl-folder/libs/armeabi/ 

để

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

cách này khi biên soạn yo u có thể bao gồm các libs sử dụng một công tắc mối liên kết đơn giản -lssl -lcrypto

Bước hai: có được nguồn mới nhất Curl cho here

Mở tập tin trong Documents/INSTALL và làm theo các bước cần thiết để làm cho toolchain độc lập và đưa vào thư mục mong muốn của bạn, và sau đó phần phức tạp, tôi cần có mã nguồn của android cho cấu hình để tiếp tục, mặc dù tôi có một openssl được biên dịch độc lập, bạn có thể bao gồm các tệp tiêu đề từ đó, trong anycase đây là phức tạp hơn phiên bản để bạn chọn những gì bạn làm, tôi đã không chọn để né tránh chúng để bạn có thể đi đến Google AOSP site và đi qua các bước để bui ld và khởi tạo môi trường.

nên nó sẽ là một cái gì đó như:

1.download,

  1. đi đến thư mục gốc của mã nguồn và chạy:

    ~: xây dựng/envsetup.sh; bữa trưa 1; chế tạo;

Vì vậy, cuối cùng chúng ta cần phải biên dịch curl với sự hỗ trợ SSL, vì vậy,

Bước ba

chiết xuất curl vào thư mục mong muốn (Tôi có một mong muốn cụ thể của việc vô hiệu hóa tất cả mọi thứ trừ http/s để giữ cho thư viện nhỏ nhất có thể có nghĩa là khoảng ~ 300k, nếu bạn muốn có nhiều giao thức hơn trong lib của mình, hãy xóa giao thức --disable cho giao thức mong muốn) chạy như sau:

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. 

Vì vậy, cuối cùng bạn có: tĩnh:

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

và chia sẻ:

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

Vì vậy, đó là nó .. mất tập tin, và lập đi :)

+0

Cảm ơn rất nhiều về Công việc của bạn. Tôi đã đưa ra lời khuyên của bạn, nhưng thay vì sdk đầy đủ, chỉ sử dụng quá độc lập như được đề cập trong hướng dẫn cài đặt cURL. Sau đó, tôi sao chép các tiêu đề openssl và .so tập tin vào các thư mục trong toolchain và thiết lập LDFLAGS và CPPFLAGS tương ứng. Một thao tác đơn giản --with-ssl đã thực hiện thủ thuật, một khi đã thiết lập một cách đúng đắn. Vì vậy, để tham khảo trong tương lai: Bạn không cần phải sử dụng Android SDK đầy đủ, toolchain là một cách có thể là tốt. – domenukk

+0

đó là trường hợp bây giờ, hai năm trước đây nó không phải là compilable bên ngoài của AOSP – Tancho

+0

Tôi đã phải sửa đổi các lệnh ở đây để http://pastebin.com/qzxzc592 không chắc chắn nếu đó là cần thiết cho tất cả mọi người mặc dù – ruler501

0

bước cho biên dịch libcurl.so với hỗ trợ ssl cho android jni có thể được tìm thấy tại đây: http://ieroot.com/2015/03/29/1728.html

Tôi đã vật lộn trong một tuần để tìm ra.

Hỏi xem có câu hỏi nào không.Tôi sẽ trả lời càng sớm càng tốt.

+0

Liên kết không hoạt động – Tancho

+0

Tôi đã thử ngay bây giờ và thấy nó hoạt động. Có thể, bạn cần thử lại. Liên hệ với tôi nếu vẫn không thể kết nối. –

1

Tôi thích cách sử dụng Docker để xây dựng các thư viện tĩnh như vậy. Có kịch bản đầy đủ ở đây - bạn chỉ cần chạy nó và lấy kết quả. Mẫu: https://gist.github.com/VictorLaskin/1c45245d4cdeab033956

kịch bản như vậy sẽ:

  • thiết lập biên soạn công cụ/utils tải sdk/ndk
  • tạo cross-biên soạn mã nguồn tùy chỉnh toolchain tải về cho libs (zlib, openssl, curl)
  • cài đặt môi trường thiết lập để biên soạn chéo
  • định cấu hình và tạo libs
  • thu thập kết quả tại một thư mục và tạo cách để có được biên soạn libs

Phiên bản cụ thể này đang sử dụng chuỗi công cụ NDK 10e và clang mới nhất.

Có bài với nhiều chi tiết ở đây: http://vitiy.info/dockerfile-example-to-compile-libcurl-for-android-inside-docker-container/

Tôi hy vọng điều này sẽ giúp một người nào đó để không lãng phí thời gian quý báu.

Các vấn đề liên quan