Как Портировать Libcurl На Android

Статья предназначена для разработчиков Android NDK, которые собираются работать с замечательной библиотекой libcURL и имеют в своем распоряжении ее исходники для пересборки в статическую библиотеку.

Автор не претендует на абсолютно правильное решение проблемы портирования этой библиотеки, а лишь делится своим опытом.

Прошу всех интересующихся под катом.



Преамбула
Я разрабатываю свои собственные приложения для Android в Windows 7, используя Eclipse Indigo для Java-оболочки собственного приложения, скомпилированного Cygwin. Собственная часть написана на C++ с включением кроссплатформенных библиотек C и возможностью отладки в Visual Studio 2010 Express. Недавно во время разработки возникла необходимость скачивать картинки из интернета.

Судя по моему предыдущему опыту разработки под Windows, я не видел ничего лучше, чем libcURL, поэтому решил сосредоточиться на ней.



Басня
Первый сюрприз обнаружился, когда я начал скачивать исходники с сайта разработчика: Curl.haxx.se/download.htm .

Для Android доступна только собранная версия.

Не беда, я подумал: «Как-нибудь соберу сам», скачал исходники (curl-7.27.0).

Был еще не поздний вечер, и я планировал за час закончить это задание и перейти к более интересным занятиям.

Я быстро просмотрел файл Android.mk и поместил все в свой 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 .

Было уже далеко за полночь, поэтому нам пришлось закончить на такой не позитивной ноте.

Утром на свежую голову я начал читать вышеизложенную статью и понял, что сама концепция сборки противоречит здравому смыслу.

Для сборки вам необходимо создать curl_config.h под полным исходным кодом Android! Читать дальше было просто бессмысленно, тем более, что найденные варианты этого волшебного заголовка не позволили нам избежать вышеописанных ошибок в cygwin. Твердо решив для себя, что этот путь ошибочен, я начал развивать заброшенную идею сборки просто из исходников, отброшенную накануне.

Нашёл статью, где друг очень любезно сказал, что это можно сделать и выложил.

скомпилированную версию blog.glowinteractive.com/2011/11/porting-curl-to-android-as-static-library .

Спасибо, что хотя бы предложили мне вручную создать заголовок конфигурации, что я и сделал.

Я взял config-mac.h, превратил его в config-android.h и включил в setup.h. И о чудо, обойдя ошибки и модифицировав config-android.h, я смог собрать библиотеку из исходников и протестировать нужную мне работоспособность (скачав картинки из интернета).



Инструкция по модификации:
в файле include/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-android.h из lib/config-mac.h. в lib/config-android.h изменять

#define OS "mac"

на

#define OS "android"

изменять

#define HAVE_IOCTL_FIONBIO 1

на

#define HAVE_FCNTL_O_NONBLOCK

Теги: #разработка для Android ndk #libcurl #C++ #Разработка для Android

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.