Разместил новость о релизе CrystaX NDK 10.1 в форуме "Мобильные устройства", но понял, что часть, относящаяся к C++ и Boost, больше относится к тематике данного форума.
Мы выпустили
CrystaX NDK 10.1, предназначенный для нативной разработки под Android, и способный прозрачно заменить Android NDK от Google. Самыми важными фичами этого релиза в контексте данного форума являются а) полноценная поддержка C++, включая C++11/C++14 и б) готовые к использованию "из коробки" библиотеки Boost.
Теперь подробнее. Во-первых, хоть в Android NDK от Google и заявлена поддержка C++, она там неполная. Ну т.е. сам язык C++ поддерживается, т.к. используются gcc и clang, а вот с поддержкой стандартной библиотеки C++ там плохо, особенно с тем, что касается C++11. В Android NDK доступны на выбор две реализации стандартной библиотеки C++ — GNU libstdc++ и LLVM libc++. К сожалению, обе работают плохо. Используя GNU libstdc++, вы не получите ни std::thread, ни std::mutex, ни std::chrono — и это далеко не все. Фактически, о полноценном C++11 можно забыть. Что же касается LLVM libc++, то там std::thread/std::mutex/std::chrono и т.д. доступны, но ее стабильность оставляет желать лучшего — т.е. при ее использовании регулярные падения вам обеспечены. Собственно говоря, из-за этого LLVM libc++ находится в "экспериментальном" статусе в Android NDK от Google.
Причины столь плохой работы обеих реализаций стандартной библиотеки C++ — неполноценная реализация Android libc (Bionic). Многие части (требующиеся по стандарту ISO C) в ней просто не реализованы, а многие из тех, что есть — реализованы с серьезными ошибками. Как один из самых запомнившихся примеров таких серьезных ошибок могу привести реализацию strtod(), которая не парсит "0xNNNN" строки, а просто возвращает 0. Ну а что касается отсутствующей функциональности, то тут можно долго перечислять — нет поддержки wide characters, нет поддержки локалей, нет поддержки многих математических функций и т.д. Понятно, что стандартная библиотека C++ просто не может быть полноценно реализована на основе такой куцей базы.
Мы решили исправить эту ситуацию и в CrystaX NDK ввели дополнительную библиотеку libcrystax.so, в которой реализовали недостающие и заместили неверно реализованные функции из Android libc. Кроме того, мы обеспечили включение этой библиотеки в процесс линковки таким образом, что все происходит прозрачным для разработчика образом. Иными словами, разработчику не приходится беспокоиться о том, где, когда и как подключать libcrystax — ровно так же, как разработчику не приходится беспокоиться о тех же вопросах касаемо libc. Именно благодаря этому CrystaX NDK и может быть использован как прозрачная замена для Android NDK от Google.
В этой библиотеке мы реализовали много того, чего требуют от стандартной реализации libc стандарты ISO C и IEEE Std 1003.1 (POSIX). Список основных фич вы может посмотреть на
странице релиза. Здесь же отмечу только тот факт, что с использованием CrystaX NDK Android становится значительно более POSIX-совместимым, чем он есть на самом деле, а следовательно, процесс портирования с других платформ становится значительно легче.
В наличии отдельной библиотеки libcrystax.so есть и еще один плюс. Все течет, все изменяется, и реализация Android libc тоже. Так, начиная с версии 5.0 (API level 21), в Android появилась поддержка математических функций, работающих с комплексными переменными. Это, очевидно, не единственное исправление, и потихоньку реализация libc и других базовых библиотек в Android улучшается. Но что делать разработчикам, программы которых должны работать и на предыдущих версиях Android? Очевидно, такое улучшение libc не сильно помогает, до тех пор, пока доля предыдущих версий Android на рынке остается существенной. В случае же использования CrystaX NDK, мы предоставляем libcrystax.so, которую разработчик пакует в свое приложение и распространяет как его часть. Тем самым, мы получаем рабочее приложение, которое не зависит от версии Android (вернее, зависит, но не от тех частей, реализация которых берется из libcrystax). Более того, в случае нахождения и исправления ошибок в libcrystax, достаточно просто перепаковать приложение, включив в него обновленную libcrystax.
Кроме того, мы включили собранные библиотеки Boost 1.57.0 в состав NDK. Использовать Boost под Android теперь
очень легко. Примечательно, что Boost библиотеки были собраны без единого изменения в исходниках Boost, что произошло благодаря libcrystax. По этой причине больше нет нужды учитывать многочисленные особенности Android в собственном коде — достаточно просто полагаться на стандартное поведение, как это предписано POSIX.
Мы работаем над реализацией регулярного автоматического регрессионного тестирования Boost на Android, так что Boost становится полноценным "гражданином" на Android — благодаря CrystaX NDK. Конечно же, это не единственная наша текущая цель, мы работаем и над другими интересными задачами. В общем же и целом мы хотим сделать нативную разработку (на C и C++) под Android удобной и приятной — раз уж Google этого не делает.
Скачивайте CrystaX NDK и используйте!