6

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

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

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

  2. 下载卷曲

  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

` 输出摘要是这个:

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

3 回答 3

15

这是解决方案,更新到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 编译:要么编译此处找到的移植版本, 要么下载 OpenSSL 的官方 1.0.0c 版本,然后使用我为 Android 兼容版本链接的 github 中提供的手册为 android 编译它

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

openssl-folder/libs/armeabi/

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

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

第二步:在这里获取 Curl 的最新资源

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

所以它会是这样的:

1.下载,

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

    〜:构建/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

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

于 2012-07-24T21:43:14.880 回答
1

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

这样的脚本将:

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

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

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

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

于 2015-07-05T13:27:56.610 回答
0

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

我挣扎了一周才弄明白。

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

于 2015-04-02T09:27:53.650 回答