6

SSLをサポートするAndroidにlibCurlを移植しようとしています。ステップ1は、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
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))

そして、あなたは行ってもいいです!

ステップ 1 : 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

ステップ 2 :ここでCurl の最新ソースを取得します。

Docs/INSTALL でファイルを開き、スタンドアロン ツールチェーンを作成して目的のフォルダーに配置するために必要な手順に従います。その後、トリッキーな部分として、スタンドアロンをコンパイルしたにもかかわらず、構成を続行するために Android のソース コードが必要でした。 openssl そこからヘッダー ファイルを含めることもできます。いずれにせよ、これはより複雑なバージョンなので、何をするかを選択します。私はそれらを回避することを選択しなかったので、Google AOSP サイトにアクセスして、ビルドと初期化の手順を実行できます。環境。

したがって、次のようになります。

1.ダウンロード、

  1. ソースコードのルートに移動して実行します:

    ~: ビルド/envsetup.sh; 昼食 1; 作る;

最後に、SSL をサポートするように curl をコンパイルする必要があります。

ステップ 3

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.

最後に : static :

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

このようなスクリプトは次のようになります。

  • コンパイル ツールのセットアップ / utils ダウンロード sdk/ndk
  • カスタム クロス コンパイル ツールチェーンの作成 ライブラリ (zlib、openssl、curl) のソース コードのダウンロード
  • クロスコンパイルの環境設定
  • ライブラリの構成と作成
  • 出力を 1 つのフォルダーに集め、コンパイル済みのライブラリを取得する方法を作成する

この特定のバージョンは、最新の NDK 10e と clang ツールチェーンを使用しています。

ここに詳細が記載された投稿があります: http://vitiy.info/dockerfile-example-to-compile-libcurl-for-android-inside-docker-container/

これが誰かが貴重な時間を無駄にしないのに役立つことを願っています.

于 2015-07-05T13:27:56.610 に答える
0

Android jni の ssl サポートを使用して libcurl.so をコンパイルする手順は、次の場所にあります: http://ieroot.com/2015/03/29/1728.html

私はそれを理解するために一週間苦労しました。

質問があれば聞いてください。できるだけ早く返信します。

于 2015-04-02T09:27:53.650 に答える