【问题标题】:porting libcurl on android with ssl support在具有 ssl 支持的 android 上移植 libcurl
【发布时间】:2012-07-05 00:32:06
【问题描述】:

我正在尝试将 libCurl 移植到具有 SSL 支持的 android, 第一步是在没有 ssl 支持的情况下移植 curl 我猜所以我开始这样做。但我遇到了问题。

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

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

  2. 下载 cURL

  3. 在 {android_src}/external/curl 下解压 curl

  4. 通过在包含此内容的 external/curl 文件夹中创建一个 sh 文件来为 curl 创建配置脚本。

`

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

【问题讨论】:

    标签: android libcurl porting android-ndk


    【解决方案1】:

    这里是解决方案,更新到 NDK8c

    零步:下载并修复 Android NDK 我不知道如何,但 ndk 有一个非常有趣的缺陷,(在我看来)不允许你编译很多东西,所以为了能够编译 OpenSSL,你需要做一个小修复,提取 ndk8c无论您将工具放在哪里,然后编辑文件: android-ndk-r8c/build/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 或者下载官方1.0.0c版本的OpenSSL,然后使用我为Android兼容版本链接的github中提供的手册为android编译它

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

    openssl-folder/libs/armeabi/
    

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

    这样编译时,您可以使用简单的链接器开关 -lssl -lcrypto 包含库

    第二步:获取 Curl 的 here

    的最新来源

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

    所以它会是这样的:

    1.下载,

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

      ~: build/envsetup.sh;午餐 1;制作;

    所以最后我们需要编译带有 SSL 支持的 curl,所以,

    第三步

    解压 curl 到想要的文件夹 (我特别希望禁用除 http/s 之外的所有内容,以使库尽可能小,这意味着大约 300k,如果您想要在您的库中使用更多协议,请删除所需协议的 --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
    

    就是这样.. 获取文件,然后编译 :)

    【讨论】:

    • 非常感谢您的工作。我接受了您的建议,但没有使用完整的 sdk,而是按照 cURL 安装指南中的建议使用了独立的工具链。然后我将 openssl 头文件和 .so 文件复制到工具链中的文件夹中,并分别设置 LDFLAGS 和 CPPFLAGS。一旦正确设置,一个简单的 --with-ssl 就可以了。因此,供将来参考:您不必使用完整的 Android SDK,工具链也是一种可能的方式。
    • 现在就是这种情况,两年多以前它在 AOSP 之外无法编译
    • 我不得不将这里的命令修改为pastebin.com/qzxzc592 不确定是否每个人都需要这样做
    • "将它们放在 NDK 文件夹中以便于访问" 完全不建议这样做,您应该使用 LOCAL_STATIC_LIBRARIES 和 NDK-Build 模块来链接您在 Android NDK 项目中使用的任何库。
    • 你好像是curl的专家呵呵,你能看看我关于cURL使用的问题吗?我已经设置好了。 stackoverflow.com/questions/34268036/…@Tancho
    【解决方案2】:

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

    这样的脚本会:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      我苦苦挣扎了一周才弄明白。

      如有任何问题,请咨询。我会尽快回复。

      【讨论】:

      • 我刚刚尝试过,发现它有效。也许,你需要再试一次。如果仍然无法连接,请联系我。
      猜你喜欢
      • 2010-09-16
      • 1970-01-01
      • 2011-08-18
      • 2022-06-19
      • 2016-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多