Статья предназначена для разработчиков под 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