Android NDK 替代方案:CrystaX NDK
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開發更容易,詳見以下關鍵特性.
-
寬字符是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系統.
-
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等等.
-
ISO C標準定義頭文件<tgmath.h>和<complex.h>. 在Google's Android NDK中, <complex.h>始于r10, 僅支持Android 5.0 (android-21), 同時泛型數學函數庫完全沒有實現.
而CrystaX NDK, 沒什么好說的,都完整實現了. 盡情使用!
-
CrystaX NDK包含最新版GCC和Clang編譯器. 允許開發人員使用最新語言特性, 例如C++11/C++14. 所有編譯器都經過不同程度的優化, 可以針對目標硬件平臺生成高效執行代碼.
-
由于CrystaX NDK包含最新版GCC和Clang編譯器, 所以它支持所有C++11/C++14特性. C++11 Support in GCC, C++14 Support in GCC 和 C++ Support in Clang.
-
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++.
-
提供了預編譯好的Boost C++庫文件. 輕松使用Boost,不用再自己折騰了.更重要的是, Boost C++庫跟CrystaX NDK更配! 因為基于更加標準化支持的CrystaX NDK(是的, 這是libcrystax, CrystaX NDK的核心).
-
支持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.
-
眾所周知Android libc (Bionic)的標準C函數實現有大量bug, 例如strtod, 只對最簡單格式的字符串輸入有效, 不支持其他標準C定義的規范. 有些缺陷已修復, 有些還未修復. 即使已修復, 也只對后續新版本有效. 開發人員只能自己實現針對已發布版本的適配. 這顯著增加了Android原生應用的開發移植時間.
CrystaX NDK在libcrystax中重寫了這些有缺陷的函數,而且平臺版本無關,對開發人員透明. 開發人員無須關注libcrystax替代Bionic的技術細節, 同時您也無須關注一個缺陷修復是針對哪個Android版本的問題, 我們保證任何缺陷修復都是全部版本生效.
授權
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.