作者: Sam (甄峰) sam_code@hotmail.com
从2012年最初接触NDK到现在已经5年过去了,从最初的NDK R7到现在已经到达NDK R14.
它本身也发生了很多变化。 例如对C++支持程度。对64bit
ARM的支持等。现有必要把这些新特性研究一下。
1. 32bit/64bit ARM平台支持:
在NDK R10的某个版本中,开始支持64bit ARM平台。那时它还是将64bit和32bit
NDK分开提供的。
当前Google支持下载的NDK中,最低版本是NDK R10e.
这个版本之后,64bit和32bit采用同一套NDK,只使用编译选项的不同来支持目标代码编译为何种平台。
Instruction Set(s) | Notes | |
---|---|---|
armeabi | ARMV5TE and later Thumb-1 |
No hard float. |
armeabi-v7a | armeabi Thumb-2 VFPv3-D16 other optional |
Hard float when specified as
armeabi-v7a-hard .Incompatible with ARMv5, v6 devices. |
arm64-v8a | AArch-64 | |
x86 | x86 (IA-32) MMX SSE/2/3 SSSE3 |
No support for MOVBE or SSE4. |
x86_64 | x86-64 MMX SSE/2/3 SSSE3 SSE4.1, 4.2 POPCNT |
|
mips | MIPS32r1 and later | Hard float. |
mips 64 | MIPS64r6 |
可以看到,只要在Application.mk中,切换:
#APP_ABI := armeabi-v7a
APP_ABI := arm64-v8a
即可选择64Bit或32Bit。 在代码中,如何区分32Bit和64Bit,可以使用
#ifdef __aarch64__
printf("\nThis is 64bit\n");
#else
printf("\nThis is 32Bit\n");
#endif
2. Clang和GCC:
从NDK R10开始支持clang. 但GCC还作为缺省编译器。
在之后的版本中,clang成为缺省编译器。
clang:
NDK_TOOLCHAIN_VERSION=clang
指出由clang编译。
GCC:
#NDK_TOOLCHAIN_VERSION=clang
NDK_TOOLCHAIN_VERSION=4.9
注1:Clang:
GCC采用GPLv3. 导致大量芯片厂商更愿意转投Clang+llvm.
注2:
GPLv3争议,Linus对它的评价:
GPL,是GNU General Public
License的缩写,是GNU通用公共授权非正式的中文翻译。它并非由自由软件基金会所发表,亦非使用GNU通用公共授权的软件的法定发布条款─只有GNU通用公共授权英文原文的版本始具有此等效力。
嗯我喜歡版本 2 的那些理由,並且我仍然覺得版本 2
是一個非常棒的協議, 理由是:「我給你源代碼,你給我你對它的修改,我們就扯平了」 對吧?這是我用 GPL 版本 2
的理由,就是這麼簡單
然後版本 3
的擴展在某些方面讓我個人覺得非常不舒服,也就是說「我給你源代碼, 這意味着你必須服從我的一些規則,否則你不能把它用在你的設備上。」
對我來說,這是違反了版本 2 協議所追求的所有目的