首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用ssl支持在android上移植libcurl

使用ssl支持在android上移植libcurl
EN

Stack Overflow用户
提问于 2012-07-04 13:34:57
回答 3查看 17.9K关注 0票数 6

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

正如我在dev网站和Android.mk文件中所看到的那样,最困难的部分是首先配置make。所以我做的是:

  1. 下载Android源代码(并编译它!)因为需要一些中间库)
  2. 下载cURL
  3. 将卷曲解压缩到:{android_src}/外接/卷曲
  4. 通过在包含此内容的外部/ curl文件夹中创建sh文件,为curl创建配置脚本。

`

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
  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-Android.mk)来编译它。

因此,我编写并得到:

代码语言:javascript
运行
复制
$ 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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-24 21:43:14

以下是更新为NDK8c的解决方案

step 0:下载并修复Android我不知道怎么做,但是ndk有一个非常有趣的缺陷,它不允许您编译大量的东西,所以要能够编译OpenSSL,您需要做一个小的修复,提取保存工具的ndk8c,然后编辑这个文件:Androd-NDK-r8c/build/gmsl/_gmsl 512 : change

代码语言:javascript
运行
复制
int_encode = $(__gmsl_tr1)$(wordlist 1,$1,$(__gmsl_input_int))

带线

代码语言:javascript
运行
复制
int_encode = $(__gmsl_tr1)$(wordlist 1,$(words $1),$(__gmsl_input_int))

你就可以走了!

第一步:下载OpenSSL并为OpenSSL编译:要么编译移植版本found 这里,要么下载OpenSSL的官方1.0.0c版本,然后使用github i链接到的与Android兼容的版本中提供的手册对OpenSSL进行编译

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

代码语言:javascript
运行
复制
openssl-folder/libs/armeabi/

代码语言:javascript
运行
复制
android-ndk-r8c/platforms/android-8/arch-arm/usr/lib

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

第二步:获取Curl的最新这里源代码

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

所以应该是这样的:

1.下载,

  1. 转到源代码的根目录并运行: ~:建造/envsetup.sh;午餐;

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

第三步

将curl解压缩到所需的文件夹(我有一个特定的愿望:禁用除http/s之外的所有东西,以使库尽可能小,意思是~300 k,如果您希望在库中有更多的协议,请删除所需协议的-禁用-协议),运行以下命令:

代码语言:javascript
运行
复制
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.

所以你终于有了:静态的:

代码语言:javascript
运行
复制
curl-7.28.1/lib/.libs/libcurl.a

并分享:

代码语言:javascript
运行
复制
curl-7.28.1/lib/.libs/libcurl.so.5.3

就这样..。)获取该文件,并进行编译:)

票数 15
EN

Stack Overflow用户

发布于 2015-07-05 13:27:56

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

这样的剧本将:

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

这个特定版本使用的是最新的NDK10e和clang工具链。

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

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

票数 1
EN

Stack Overflow用户

发布于 2015-04-02 09:27:53

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

我挣扎了一个星期才弄明白。

如果有任何问题问。我会尽快回复的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11330180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档