使用ssl支持在android上移植libcurl

时间:2012-07-04 13:34:57

标签: android libcurl porting android-ndk

我正在尝试通过SSL支持将libCurl移植到android, 第一步是在没有ssl支持的情况下移植curl我想我开始这么做了。但我遇到了一个问题。

当我在开发网站和Android.mk文件中阅读时,困难的部分是首先配置make。所以我做的是:

  1. 下载Android源代码(并编译它!因为需要一些中间库)

  2. 下载cURL

  3. 解压卷曲:{android_src} / external / curl

  4. 通过使用此内容在external / curl文件夹中创建sh文件来为curl创建配置脚本。

  5. `

    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
    

    ` 输出摘要就是这个:

    configure:配置为构建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.
    

    首先想到的是,为什么SSL不包含在配置中,因为链接器显示到中间库并且调用了ssl支持标志,但之后我在jni项目中使用相同的curl_config.h文件我为构建创建(因为它有一个独立的Android.mk文件,只需在android项目的jni文件夹中解压缩,复制在AOSP源中创建的配置文件并调用ndk-build)

    所以我编译并得到:

    $ 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
    

3 个答案:

答案 0 :(得分:13)

这是解决方案,更新为NDK8c

第0步:下载并修复Android NDK 我不知道如何但是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编译: 编译找到here的移植版本 或者下载OpenSSL的官方1.0.0c版本,然后使用我为Android兼容版本链接的github中提供的手册为Android编译

所以下一步是获取 libssl.so libcrypto.so 并将它们放在NDK文件夹中以便于访问,因此请从

复制它们
openssl-folder/libs/armeabi/

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

这种方式在编译时可以使用简单的链接器开关-lssl -lcrypto

包含libs

第二步:获取Curl here的最新来源

在Docs / INSTALL中打开文件并按照制作独立工具链所需的步骤放入所需的文件夹,然后是棘手的部分,我需要让android的源代码继续进行配置,即使我有一个独立的编译openssl你也可以包含那里的头文件,无论如何这是更复杂的版本,所以你选择你做的,我没有选择逃避它们所以你可以去Google AOSP site然后通过构建和初始化环境的步骤。

所以它会是这样的:

1.download,

  1. 转到源代码的根目录并运行:

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

  2. 所以最后我们需要使用SSL支持编译curl,所以,

    第三步

    将curl提取到所需的文件夹 (我特别希望禁用除http / s之外的所有内容以保持库尽可能小,意味着大约300k,如果你想在你的lib中有更多的协议,删除所需协议的--disable-protocol) 运行以下内容:

    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
    

    所以就是这样......拿走文件,然后编译掉:)

答案 1 :(得分:1)

我喜欢使用Docker构建这样的静态库的方法。这里有完整的脚本 - 你只需运行它并获取结果。示例:https://gist.github.com/VictorLaskin/1c45245d4cdeab033956

这样的剧本将:

  • 安装编译工具/ utils下载sdk / ndk
  • 为libs创建自定义交叉编译工具链下载源代码(zlib,openssl,curl)
  • 交叉编译的设置环境设置
  • 配置并制作库
  • 在一个文件夹中收集输出并创建获取方式 已编译的库

此特定版本使用最新的NDK 10e和clang工具链。

这里有更多详情的帖子:http://vitiy.info/dockerfile-example-to-compile-libcurl-for-android-inside-docker-container/

我希望这能帮助别人浪费宝贵的时间。

答案 2 :(得分:0)

可以在此处找到使用ssl支持android jni编译libcurl.so的步骤: http://ieroot.com/2015/03/29/1728.html

我挣扎了一个星期才搞清楚。

询问是否有任何问题。我会尽快回复。