Приветствую всех читателей!
Спешу сообщить о выпуске CrystaX NDK 10.1 — набора инструментов для разработки на C/C++ (и Objective-C) под Android.
CrystaX NDK разработан как прозрачная замена для Android NDK от Google, но при этом добавляет немало вкусностей, отсутствующих в оригинальном NDK. Прежде всего, это означает, что CrystaX NDK можно использовать вместо Google NDK, и все будет продолжать работать как раньше. Но при этом станут доступными многие вещи, отсутствующие в Google NDK.
В этом релизе мы проделали немалую работу по обеспечению большей совместимости со стандартами ISO C, ISO C++ и IEEE Std 1003.1 (POSIX), благодаря чему портирование существующего кода на Android становится намного легче. Как вы, быть может, знаете, Android libc (Bionic) далека от того, чтоб соответствовать указанным стандартам. Многие части просто не реализованы, другие — реализованы с ошибками, заставляющими провести в отладке долгие часы, тем более что уж от libc этого не ожидаешь (помню до сих пор, как пришлось отлаживатся два дня, прежде чем выяснилось, что strtod() не умеет парсить «0xXXXX» строки). Конечно, со временем ситуация улучшается, и в новых версиях Android libc потихоньку исправляется и дополняется, но а) темпы исправлений и дополнений абсолютно неудовлетворительны и б) что делать разработчикам, программы которых должны работать не только на последних, но и на предыдущих версиях Android?
В CrystaX NDK мы решили эти проблемы путем введения дополнительной библиотеки libcrystax, в которой мы реализовали недостающий и неправильно реализованный функционал из Bionic. Это также решает проблему запуска программ на более ранних версиях Android, т.к. libcrystax.so пакуется вместе с приложением и не зависит от версии Android. Само введение дополнительной библиотеки тоже сделано максимально прозрачным способом — т.е. ничего дополнительно разработчику указывать не надо, все соберется автоматически. Иными словами, типичный процесс разработки с использованием NDK остается без изменений, что и позволяет использовать CrystaX NDK как прозрачную замену для Android NDK от Google.
Итак, здесь я кратко перечислю основные фичи CrystaX NDK:
- Полная поддержка широких символов (wchar_t), включая возможность конвертирования из мультибайтных кодировок (таких как UTF-8) в широкосимвольные и наоборот. Очень помогает при портировании существующего кода (например, из мира Windows) под Android.
- Полная поддержка нативной локализации — т.е. printf(), strftime(), strfmon() и прочие работают с учетом локали, выставленной с помощью setlocale(). Это означает возможность локализации приложений без обращения к JNI. Также доступна широко известная библиотека ICU, что означает полную поддержку Unicode для тех, кому это нужно.
- Полная поддержка математических функций в соответствии со стандартом IEEE Std 1003.1, 2013 Edition, включая функции для работы с комплексными значениями и типо-независимые (type-generic) функции.
- Полная поддержка стандартной бибилиотеки C++. Несмотря на заявленную поддержку C++ в Android NDK от Google, она остается чисто номинальной, т.к. большая часть из стандартной библиотеки C++ не работает. В частности, не поддерживаются std::mutex, std::chrono, std::stol, std::stoul и многие другие. В случае же использования CrystaX NDK вы получаете полноценную поддержку C++ — как языка, так и его стандартной библиотеки.
- Библиотеки Boost «из коробки». Мы предоставляем собранные библиотеки Boost 1.57.0 в составе CrystaX NDK, так что теперь использование Boost для программирования под Android становится очень простым. Кроме того, Boost в CrystaX NDK работает намного лучше того же Boost, собранного с помощью Android NDK от Google, просто потому, что в нашем случае он работает поверх значительно более соответствующего стандартам уровня, чем обычная Android libc (да, я говорю о libcrystax, сердце CrystaX NDK).
- Включена поддержка языков программирования Objective-C и Objective-C++ — и в gcc, и в clang. На данный момент поддержка ограничена ядром этих языков; ведется работа над Objective-C v2 runtime и Cocoa-like библиотеками. Однако, для многих проектов и этого достаточно, поэтому данная возможность доступна в CrystaX NDK.
С более полным описанием можно ознакомиться на странице релиза.
На этом, пожалуй, остановлюсь. Если есть вопросы, с радостью отвечу в комментариях.
Автор: crystax