Android NDK 替代方案:CrystaX NDK

7n5e 9年前

CrystaX NDK是Google's Android NDK的一个替代方案. 相比谷歌的NDK, CrystaX NDK在支持相同功能的同时, 提供了一些很棒的新功能和大量的缺陷修复和改进.

CrystaX NDK的主要目的是让Android开发者更高效地运用标准化代码进行native开发. 通过使用那些支持多平台 (IOS, OS X, Windows, Linux 等等) 的标准代码库,CrystaX NDK显著节省了开发时间,不需要再为Android平台做特殊修改(甚至于为Android特殊定制实现那些在其他平台早已实现的功能).

由于Android libc(Bionic)功能有限,版本之间还不尽相同,开发者需要做很多运行时版本检测和兼容性适配的额外工作. CrystaX NDK提供的libcrystax屏蔽了Android版本兼容性差异,甚至重写了很多libc函数,使得应用程序在所有Android设备上表现一致.

CrystaX NDK的另一个目的是为Android Native开发提供一些很棒的新功能.例如: Objective-C和其他编程语言的支持.

这个项目最初是2009年Dmitry Moskalchuk的个人项目,只是为了添加一些Google Android NDK缺失的C++特性(exceptions,RTTI,C++标准库),后来越加越多, 不断优化, CrystaX NDK逐步变成了Android native开发的最佳进化.很多开源和商业化项目使用CrystaX NDK进行Android开发和移植.

现在CrystaX NDK提供了大量新功能,使得Android native开发更容易,详见以下关键特性.

  1. 完整支持宽字符

    宽字符是C和C++标准库的一部分,例如C标准库的wcsnlen, wcsncasecmp, wcsncmp 和其他,        C++标准库的wchar_t, std::base_string, std::basic_ostream, std::basic_regex等等.Android libc (Bionic)对这些支持不足.

    CrystaX NDK提供标准化的宽字符支持,包括multibyte-to-wide和反之亦然的转换.        你可以轻松移植已有代码, 或者撰写新代码, 尽情使用宽字符, 字符串, 流以及正则表达式, 不再受限于Android系统.


    例子

  2. 完整支持C locales

    Android libc (Bionic) 不支持locales, 所以在native代码中使用本地化输入输出的唯一方法是通过JNI调用Java本地化实现.        显然这种方法增加了显著的运行时开销, 但这是你使用谷歌Android NDK的唯一选择.

    CrystaX NDK内置支持locales, 只需简单调用标准的setlocale,        所有后续C标准函数调用都使用设置的locale做输入输出. CrystaX NDK还支持"locales扩展" (部分 IEEE Std 1003.1, 2013 Edition),        提供很多标准C接口的locale有效的函数,例如printf_l, strftime_l, strfmon_l等等.


    例子

  3. 完整数学支持, 包括复数和泛型函数库

    ISO C标准定义头文件<tgmath.h>和<complex.h>. 在Google's Android NDK中,        <complex.h>始于r10, 仅支持Android 5.0 (android-21), 同时泛型数学函数库完全没有实现.

    而CrystaX NDK, 没什么好说的,都完整实现了. 尽情使用!

  4. 最新工具链

    CrystaX NDK包含最新版GCC和Clang编译器. 允许开发人员使用最新语言特性, 例如C++11/C++14.        所有编译器都经过不同程度的优化, 可以针对目标硬件平台生成高效执行代码.

  5. C++11/C++14支持

    由于CrystaX NDK包含最新版GCC和Clang编译器, 所以它支持所有C++11/C++14特性. C++11 Support in GCC, C++14 Support in GCCC++ Support in Clang.

  6. 完整的C++标准库

    CrystaX NDK提供完整可用的C++11标准库, 包括std::thread 和 std::mutex, std::chrono的类和方法, 以及方法std::stol, std::stoul etc.        这些在Google's Android NDK中都缺失.或者严格地说,存在但仅限于实验版的LLMV libc++实现.

    CrystaX NDK完整支持C++标准库, 无论你使用GNU libstdc++或LLVM libc++.

    另外, LLVM libc++ 在CrystaX NDK中也是第一优先级, 地位等同于GNU libstdc++, 所以你可以自由选择其中之一,默认使用GNU libstdc++.


    例子

  7. 内置Boost C++库

    提供了预编译好的Boost C++库文件. 轻松使用Boost,不用再自己折腾了.更重要的是, Boost C++库跟CrystaX NDK更配!        因为基于更加标准化支持的CrystaX NDK(是的, 这是libcrystax, CrystaX NDK的核心).

    例子 如何在Android工程中使用Boost C++库.

  8. 支持Objective-C and Objective-C++

    Google's NDK只支持C C++. CrystaX NDK还支持Objective-C和Objective-C++.

    从CrystaX NDK 10.2.0开始, 我们新增支持Objective-C v2 runtime 和初始版本的frameworks (Foundation and CoreFoundation).

    这里 是一个小例子, 介绍如何在Android平台使用Objective-C.        简单说明, 只需添加源码文件到Android.mk, LOCAL_SRC_FILES 添加.m (Objective-C) 和.mm (Objective-C++),        添加"APP_OBJC := cocotron" 到 Application.mk.

  9. 标准C库的大量缺陷修复和功能改进

    众所周知Android libc (Bionic)的标准C函数实现有大量bug, 例如strtod,        只对最简单格式的字符串输入有效, 不支持其他标准C定义的规范. 有些缺陷已修复, 有些还未修复.        即使已修复, 也只对后续新版本有效. 开发人员只能自己实现针对已发布版本的适配.        这显著增加了Android原生应用的开发移植时间.

    CrystaX NDK在libcrystax中重写了这些有缺陷的函数,而且平台版本无关,对开发人员透明.        开发人员无须关注libcrystax替代Bionic的技术细节, 同时您也无须关注一个缺陷修复是针对哪个Android版本的问题,        我们保证任何缺陷修复都是全部版本生效.

  10. 未完待续...

    如果你还需要其他特性,请联系我们.        欢迎反馈问题和缺陷, 当然,也非常欢迎贡献!

授权

CrystaX NDK包含若干open-source licenses. 详见每个模块的版权声明文件.

请注意CrystaX NDK发布包中也包括编译器,链接器,文档等的预编译二进制文件. 工具链的源码在GitHub (你可以使用编译脚本自动下载它).

预编译的GCC和其他二进制文件(GDB, binutils 等等)基于the GNU General Public License (GPL) 或 the GNU Lesser General Public License (LGPL). 详见COPYING and COPYING.LIB 位于 $NDK/toolchains/<toolchain>/prebuilt/<system>.

预编译的LLVM/Clang工具链基于 LLVM "BSD" license.

基本上, 授权规则等同于Google's Android NDK - 例如, 允许商业&非商业用途. 唯一区别是CrystaX部分, 基于 BSD 2-clause license.

项目主页:http://www.open-open.com/lib/view/home/1437792495740