Pull to refresh

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

Reading time 3 min
Views 6K
Статья предназначена для разработчиков под 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. Твердо решив для себя, что данный путь порочен, я начал развивать заброшенную идею о сборке просто из исходников, заброшенную накануне. Нашел статью, где товарищ очень любезно сказал, что так сделать можно и выложил… скомпилированый вариант 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	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. Там то-же что и здесь, но опять же слишком многое нужно додумывать.
Tags:
Hubs:
+10
Comments 9
Comments Comments 9

Articles