Как портировать libcURL под Android

в 9:16, , рубрики: c++, libcurl, Разработка под android, метки:

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

Всех заинтересовавшихся прошу под кат.

Преамбула

Разрабатываю собственное Android-приложения на Windows 7, использую Eclipse Indigo для Java-обертки native-приложения, собранного Cygwin-ом. Native часть написана на 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 definition is missing!», и иже с ними. Полез искать решение проблемы: 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. Твердо решив для себя, что данный путь порочен, я начал развивать заброшенную идею о сборке просто из исходников, заброшенную накануне. Нашел статью, где товарищ очень любезно сказал, что так сделать можно и выложил… скомпилированый вариант. Спасибо хоть за то, что хотя-бы подсказал, что надо вручную сделать хедер конфигурации, чем я и занялся. Взял 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	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. Там то-же что и здесь, но опять же слишком многое нужно додумывать.

Автор: antonyter

Источник

Поделиться

* - обязательные к заполнению поля