libcURLをAndroidに移植する方法

この記事は、Android NDKの下で素晴らしいlibcURLライブラリを使用し、静的ライブラリに再構築するためのソースを自由に使用できる開発者を対象としています。 著者は、このライブラリの移植の問題に対する絶対的に正しい解決策であると主張していませんが、彼の経験を共有しているだけです。

猫の下で興味を持っている皆にお願いします。

前文

CygwinによってコンパイルされたネイティブアプリケーションのJavaラッパーにEclipse Indigoを使用して、Windows 7上で独自のAndroidアプリケーションを開発しています。 ネイティブパーツはC ++で記述されており、Cにはクロスプラットフォームライブラリが含まれており、Visual Studio 2010 Expressでデバッグできます。

最近、開発中に、インターネットから画像を取り込む必要が生じました。 Windowsの以前の開発経験によると、libcURLより良いものは見たことがありませんでしたので、それについて詳しく調べることにしました。

プロット

開発者のサイトcurl.haxx.se/download.htmからソースをダウンロードし始めたとき、最初の驚きがありました。 Androidでは、アセンブルされたバージョンのみがそこに投稿されます。 「どういうわけか自分でアセンブリを構築している」と思ったので、それは問題ではありませんでしたが、rawをダウンロードしました(カール7.27.0)。

夕方遅くではなく、1時間後にこのタスクを完了し、より興味深い活動に進む予定でした。 Android.mkファイルを流scannedにスキャンし、すべてを自分のAndroid.mkに混ぜてこの奇跡を作りました。 cygwinの非常に不快なエラー-「CURL_SIZEOF_LONG定義がありません!」 問題の解決策を探すと役に立ちます: stackoverflow.com/questions/4952169/using-curl-in-android 。 アドバイス通りにすべてを行いましたが、マクロが見つからないというエラーが残りました。 その結果、自分で実験するのは愚かなことに気づき、 thesoftwarerogue.blogspot.ru / 2010 / 05 / porting-of-libcurl-to-android-os-using.htmlのような記事を読みに行きました。 すでに真夜中を過ぎていたので、そのような非肯定的なノートでは丸められなければなりませんでした。

朝、新鮮な心で、私は上記の記事を読み始め、アセンブリの概念自体が常識に反していることに気付きました。 ビルドするには、Androidの完全なソースコードの下にcurl_config.hを作成する必要があります! 特にこのマジックヘッダーで見つかったオプションでは、cygwinで上記のエラーを回避することができなかったため、これ以上の読みは無意味でした。 この道に欠陥があると自分でしっかりと決めたので、私は前日に見捨てられたソースコードから組み立てるという見捨てられたアイデアを開発し始めました。 友人がこれを行うことができると非常に親切に言って、 blog.glowinteractive.com / 2011/11 / porting-curl-to-android-as-static-libraryのコンパイルされたバージョンを投稿した記事を見つけました。 少なくとも、手動で構成ヘッダーを作成するように促してくれてありがとう。 config-mac.hを取得し、そこからconfig-android.hを作成し、setup.hに含めました。 そして見よ-config-android.hをファイナライズすることでエラーをバイパスし、ソースからライブラリを収集し、必要なパフォーマンスをテストすることが判明しました(インターネットから画像をポンピング)。

改訂の手順:

インクルード/ curl / curlbuild.h

見つける
#elif defined(__GNUC__) 
セクションを追加
 # else # define CURL_SIZEOF_LONG 4 # define CURL_TYPEOF_CURL_OFF_T long long # define CURL_FORMAT_CURL_OFF_T "lld" # define CURL_FORMAT_CURL_OFF_TU "llu" # define CURL_FORMAT_OFF_T "%lld" # define CURL_SIZEOF_CURL_OFF_T 8 # define CURL_SUFFIX_CURL_OFF_T LL # define CURL_SUFFIX_CURL_OFF_TU ULL 
彼女に電話してもいいですか
  #elif defined(ANDROID) 
フォロー中
 elif defined(__x86_64__) || defined(__ppc64__)... 

lib / setup.h内

見つける
 #ifdef __VXWORKS__ # include "config-vxworks.h" #endif 
そしてその後に追加
 #ifdef __GNUC__ # include "config-android.h" #endif 

lib / config-mac.hからlib / config-android.hを作成します

lib / config-android.hで

変わる
 #define OS "mac" 

 #define OS "android" 

変わる
 #define HAVE_IOCTL_FIONBIO 1 

 #define HAVE_FCNTL_O_NONBLOCK 1 

変わる
 #define SEND_TYPE_ARG3 size_T 

 #define SEND_TYPE_ARG3 size_t 

行を削除する
 #define HAVE_EXTRA_STRICMP_H 1 #define HAVE_EXTRA_STRDUP_H 1 


記事を書いた後、 groups.google.com / forum /?fromgroups = !Topic / android-ndk / JmJYxZ7s8G8に出会いました。 ここと同じですが、考え直す必要があります。

Source: https://habr.com/ru/post/J158743/


All Articles