本页提供了与所有已发布的稳定版 NDK 中发生的变更有关的信息。如需下载最新的稳定版 NDK 或任何目前可用的 Beta 版,请参阅 NDK 下载页面。
如需了解更完整的信息,请访问 android-ndk-announce Google 群组;如需接收版本通告,请订阅。
Android NDK r27 LTS(2024 年 7 月)
变更记录- 下载
-
- 请从此处下载此版本。
Android NDK r26 LTS(2023 年 9 月)
变更记录- 下载
-
- 请从此处下载此版本。
- 通告
-
- 不再支持 KitKat(API 19 和 20)。
Android NDK r25 LTS(2022 年 7 月)
变更记录- 下载
-
- 请从此处下载此版本。
- 通告
-
- 包含 Android 13 API。
- 基于 LLVM 14 开发成果,将 LLVM 更新为 clang-r450784d。
Android NDK r24(2022 年 3 月)
变更记录- 下载
-
- 请从此处下载此版本。
- 通告
-
-
移除了 GNU 汇编器 (GAS)。如果您是使用
-fno-integrated-as
进行构建,则需要移除该标志。如需了解如何使汇编与 LLVM 兼容,请参阅 Clang 迁移说明。 - GDB 已被移除。请改用 LLDB。请注意,ndk-gdb 默认使用 LLDB,而 Android Studio 只支持 LLDB。
- Jelly Bean(API 16、17 和 18)不再受支持。NDK 支持的最低操作系统是 KitKat(API 级别 19)。
- 非 Neon 设备不再受支持。极少数非常旧的设备不支持 Neon。因此,除了性能得到提升之外,大多数应用都不会注意设备是否支持 Neon。
- 移除了 RenderScript 构建支持。Android 12 中废弃了 RenderScript。如果您尚未完成将您的应用迁离 RenderScript 的操作,可以使用 NDK r23 LTS。
-
移除了 GNU 汇编器 (GAS)。如果您是使用
Android NDK r23 LTS(2021 年 8 月)
变更记录- 下载
-
- 请从此处下载此版本。
- 通告
-
-
移除了 GNU binutils(不包括 GNU 汇编器 [GAS])。GAS 将在下一版本中移除。使用
-fno-integrated-as
进行构建时,如果无法移除该标志,请提交 bug 报告。 -
对 GDB 的支持已结束。GDB 将从下一个版本中移除。请改用 LLDB。请注意,
ndk-gdb
默认使用 LLDB。 - NDK r23 是支持非 Neon 设备的最后一个版本。从 NDK r24 开始,sysroot 中的 armeabi-v7a 库将使用 Neon 构建。极少数非常旧的设备不支持 Neon。因此,除了性能得到提升之外,大多数应用都不会注意设备是否支持 Neon。
- 下一 NDK 版本将不支持 Jelly Bean(API 16、17 和 18)。NDK r24 支持的最低操作系统是 KitKat(API 级别 19)。
-
移除了 GNU binutils(不包括 GNU 汇编器 [GAS])。GAS 将在下一版本中移除。使用
Android NDK r22b(2021 年 3 月)
变更记录- 下载
-
- 请从此处下载此版本。
- 通告
-
-
GNU binutils 已废弃,并会在即将发布的 NDK 版本中移除。请注意,GNU 编译器 (
as
) 也是如此。使用-fno-integrated-as
进行构建时,如果无法移除该标志,请提交错误报告。如果您是直接使用as
的,请改用clang
。 - LLD 现在是默认链接器。 ndk-build 和我们的 CMake 工具链文件也已改为使用 llvm-ar 和 llvm-strip。
- ndk-gdb 现在使用 lldb 作为调试程序。gdb 已被废弃,并将在未来的版本中移除。如需回退到 gdb,请使用 -no-lldb 选项。不过,请提交错误报告,说明您无法使用 lldb 的原因。
-
现已支持
std::filesystem
。有两个已知问题:
-
GNU binutils 已废弃,并会在即将发布的 NDK 版本中移除。请注意,GNU 编译器 (
Android NDK r21e LTS(2021 年 1 月)
变更记录- 下载
-
- 请从此处下载此版本。
- 通告
-
-
不再支持 32 位 Windows。这不会影响绝大多数用户。如果您仍需要从 32 位版本的 Windows 构建 NDK 应用,请继续使用 NDK r20。
如需详细了解 Android 开发者工具中的这一变更,请参阅有关该主题的博文。
-
LLD 现已可供测试。AOSP 已改为默认使用 LLD,NDK 也将紧随其后进行改换(时间未定)。如需在您的应用中测试 LLD,请在建立链接时传递
-fuse-ld=lld
。请注意,问题 843 会影响结合 LLD 使用 binutils strip 和 objcopy 的 build,而不会影响使用 llvm-strip 和 llvm-objcopy 的 build。 -
旧版工具链安装路径将在未来版本中移除。自 NDK r19 起,这些路径就已过时,且在 NDK 中占用了相当大的空间。要移除的路径为:
- platforms
- sources/cxx-stl
- sysroot
- toolchains(toolchains/llvm 除外)
make_standalone_toolchain.py
用户(尽管从 r19 开始就不需要该脚本)。如需了解如何从旧版工具链布局中迁出,请参阅您所使用的 NDK 版本的构建系统维护人员指南。 - 从 2019 年 8 月开始,在您上传 APK 时,Play 商店会要求支持 64 位。请立即开始移植,以免到时出现意外。如需了解详情,请参阅此博文。
- 现在,您可以从我们的 Wiki 和网站下载已签名并公证的 macOS App Bundle。请注意,由于只有 App Bundle 可以使用 RPATH 和通过公证,因此适用于 macOS 的传统 NDK 软件包无法获得公证。SDK 将继续使用传统软件包,原因在于 App Bundle 需要更改布局,这会使其与 Android Studio 不兼容。通过 SDK 管理器下载此类 NDK 时,NDK 不会被隔离,因此目前 Gatekeeper 允许使用该 NDK。目前,对于适用于 macOS 的 NDK,通过 SDK 管理器获取是最可靠的方式。
-
Android NDK r20b(2019 年 6 月)
变更记录Android NDK r19c(2019 年 1 月)
变更记录- 下载
-
- 请从此处下载此版本。
- 通告
-
-
开发者应开始对其应用进行 LLD 方面的测试。AOSP 已改为默认使用 LLD,并且在下一版本中,NDK 也将默认使用 LLD。如果 LLD 经历了一个版本周期(预计为 r21)而没有出现未解决的重大问题,则 BFD 和 Gold 将被移除。请在建立链接时传递
-fuse-ld=lld
,以在您的应用中测试 LLD。注意:lld 目前在 Windows 上不支持压缩符号。问题 888。Clang 也无法在 Windows 上生成压缩符号,在使用通过 Darwin 或 Linux 构建的工件时,这可能会成为一个问题。 - 从 2019 年 8 月开始,在您上传 APK 时,Play 商店会要求支持 64 位。请立即开始移植,以免到时出现意外。如需了解详情,请参阅此博文。
-
问题 780:现在不需要独立工具链。Clang、binutils、sysroot 以及其他工具链组件现已全部安装到
$NDK/toolchains/llvm/prebuilt/<host-tag>
,并且 Clang 会自动寻找它们。请直接从 NDK 调用编译器,而不是为 API 26 ARM 创建独立的工具链: 对于 r19,该工具链也安装到了旧路径,以提供 build 系统有机会适应新布局。旧路径会在 r20 中移除,$ $NDK/toolchains/llvm/prebuilt/
/bin/armv7a-linux-androideabi26-clang++ src.cpp make_standalone_toolchain.py
脚本不会被 已移除。现已不需要此脚本,并且它会发出包含上述信息的警告,但此脚本会保留下来以维持现有工作流。如果您使用的是 ndk-build、CMake 或独立工具链,那么您的工作流应该不会出现任何变化。这项变更对于第三方构建系统的维护者来说非常有用,他们现在应该能够删除一些 Android 专用代码。有关详情,请参阅 构建 系统维护人员指南。 - 移除了 ndk-depends。若要解决旧版 Android 上的原生库加载问题,我们认为 ReLinker 是一个更好的解决方案。
- 问题 862:移除了重定向到 Clang 的 GCC 封装容器脚本,因为它们在功能方面有所不足,无法用作替代方案。
-
开发者应开始对其应用进行 LLD 方面的测试。AOSP 已改为默认使用 LLD,并且在下一版本中,NDK 也将默认使用 LLD。如果 LLD 经历了一个版本周期(预计为 r21)而没有出现未解决的重大问题,则 BFD 和 Gold 将被移除。请在建立链接时传递
Android NDK r18b(2018 年 9 月)
变更记录Android NDK r17c(2018 年 6 月)
变更记录- 下载
-
- 请从此处下载此版本。
- 通告
-
- GCC 不再受支持,且将在 NDK r18 中移除。
-
libc++ 现在是 CMake 和独立工具链的默认 STL。如果您已手动选择其他 STL,我们强烈建议您迁移到
libc++
。请注意,ndk-build 仍默认为无 STL。如需了解详情,请参阅此博文。 - gnustl 和 stlport 已被弃用,并且将在 NDK r18 中被移除。
- 取消了对 ARMv5 (armeabi)、MIPS 和 MIPS64 的支持。尝试编译任何此类 ABI 都会导致错误。
- r18 中将取消对 ICS(android-14 和 android-15)的支持。
- 从 2019 年 8 月开始,在您上传 APK 时,Play 商店会要求支持 64 位。请立即开始移植,以免到时出现意外。如需了解详情,请参阅此博文。
Android NDK r16b(2017 年 12 月)
变更记录- 下载
- 请从此处下载此版本。
- 通告
-
- 移除了弃用的头文件。统一头文件现已简化为“头文件”。如需迁移提示,请参阅统一头文件迁移说明。
- GCC 不再受支持,虽然尚未从 NDK 中移除,但其已不再接收向后移植项。只有在 libc++ 足够稳定,可以成为默认 STL 之后,才能移除 GCC,因为 gnustl 的某些部分仍与 Clang 不兼容。当从 r18 中移除其他 STL 后,便会移除 GCC。
libc++
已结束测试,现已成为 NDK 中的首选 STL。从 r17 开始,libc++
已成为 CMake 和独立工具链的默认 STL。如果您已手动选择其他 STL,我们强烈建议您迁移到libc++
。如需了解详情,请参阅此博文。- 弃用了对 ARM5 (armeabi)、MIPS 和 MIPS64 的支持。它们在默认情况下不再使用 ndk-build 进行构建,但在明确指定的情况下仍可构建,并且“all”“all32”和“all64”会将其包含在内。从 r17 中移除了对其中每一项的支持。如果您以其中任何 ABI 作为目标,则 CMake 和 ndk-build 都会发出警告。
- API
-
为 Android 8.1 添加了原生 API。如需详细了解这些 API,请参阅原生 API 概览。
如需详细了解此版本的新变化以及变更内容,请查看此变更记录。
Android NDK r15c(2017 年 7 月)
变更记录- 下载
- 请从此处下载此版本。
- 通告
-
- 默认情况下会启用统一头文件。要了解如何使用这些头文件,请参阅统一头文件。
- GCC 不再受支持,虽然尚未从 NDK 中移除,但其已不再接收向后移植项。只有在 libc++ 足够稳定,可以成为默认 STL 之后,才能移除 GCC,因为 gnustl 的某些部分仍与 Clang 不兼容。
- Android 2.3 (
android-9
) 不再受支持。现在,NDK 中的最低目标 API 级别为 Android 4.0 (android-14
)。如果您设置的APP_PLATFORM
低于android-14
,则系统会改为使用android-14
。 - NDK 中的 CMake 现在支持构建以 YASM 编写的汇编代码,以便在 x86 和 x86-64 架构上运行。如需了解详情,请参阅编译汇编代码。
注意:已废弃的头文件会在即将发布的版本中移除。如果您遇到任何与这些头文件相关的问题,请提交 bug 报告。
如需迁移提示,请参阅统一头文件迁移说明。
- API
-
为 Android 8.0 添加了原生 API。如需详细了解这些 API,请参阅原生 API 概览。
如需详细了解此版本的新变化以及变更内容,请查看此变更记录。
Android NDK r14b(2017 年 3 月)
变更记录- 下载
- 请从此处下载此版本。
- 通告
-
- 统一头文件:此版本中引入了平台头文件,这些头文件与 Android 平台保持同步,并始终是最新版本且准确无误。仅针对头文件的问题修复现在会影响所有 API 级别。统一头文件的引入解决了早期 NDK 版本中的不一致问题,例如:
- M 和 N 中的头文件实际上是 L 的头文件。
- 头文件中的函数声明未与其平台级别正确匹配;头文件声明了不存在的函数,或未声明可用的函数。
- 若干旧 API 级别缺少某些常量或包含不正确的常量,而这些常量出现在了新的 API 级别中。
默认情况下,这些新的统一头文件处于未启用状态。要了解如何启用和使用这些头文件,请参阅统一头文件。
- GCC 弃用:此版本结束了对 GCC 的有效支持。虽然尚未从 NDK 中移除 GCC,但其已不再接收向后移植项。由于 gnustl 的某些部分仍与 Clang 不兼容,因此只有在 libc++ 足够稳定,可以成为默认 STL 之后,才会完全移除 GCC。
- 统一头文件:此版本中引入了平台头文件,这些头文件与 Android 平台保持同步,并始终是最新版本且准确无误。仅针对头文件的问题修复现在会影响所有 API 级别。统一头文件的引入解决了早期 NDK 版本中的不一致问题,例如:
如需详细了解此版本的新变化以及变更内容,请查看此变更记录。
Android NDK r13b(2016 年 10 月)
- 下载
- 请从此处下载此归档版本。
- 通告
-
- GCC 不再受支持,虽然尚未从 NDK 中移除,但其已不再接收向后移植项。只有在 libc++ 足够稳定,可以成为默认 STL 之后,才能移除 GCC,因为 gnustl 的某些部分仍与 Clang 不兼容。在此时间点之后,可能会将其移除。
- 添加了 simpleperf,它是一个适用于 Android 的 CPU 性能剖析器。
- r13b
-
-
进一步修复了缺少
__cxa_bad_cast
问题。
-
进一步修复了缺少
- NDK
-
NDK_TOOLCHAIN_VERSION
现已默认为 Clang。- libc++ 已更新至 r263688。
- 我们已重置为(近乎)无错的上游。这应该会移除许多错误,但我们仍需清理 libandroid_support,然后才会建议将其用作默认 STL。
-
make-standalone-toolchain.sh
现在只是此工具的 Python 版本的封装容器。在行为方面存在一些差异。如需了解详情,请参阅提交消息。 - 移除了部分用于不受支持的 ABI 的库(mips64r2、mips32r6、mips32r2 和 x32)。但是,可能仍有一些这样的库。
- 修复了在针对 ARM android-21+ 构建静态可执行文件期间,导致关联时缺少 atexit 的 crtbegin_static.o 问题:问题 132
- 在 build/cmake/android.toolchain.cmake 中添加了 CMake 工具链文件。
- 已知问题
Android NDK r12b(2016 年 6 月)
- 下载
- 请从此处下载此归档版本。
- 通告
ndk-build
命令在 r13 中默认为使用 Clang。我们将在后续版本中移除 GCC。make-standalone-toolchain.sh
脚本将在 r13 中移除。请确保make_standalone_toolchain.py
符合您的需求。- 向 GitHub 报告问题。
- 我们修复了
ndk-gdb.py
。(问题 118) -
我们更新了
NdkCameraMetadataTags.h
,以使其不再包含无效的枚举值。 - 修复了 ndk-build 中的一个 bug,它会导致针对使用 libc++ 的静态库发出错误警报。如需详细了解此变更,请参阅此处的注释。
- 针对 android-24 更新了 OpenSLES 头文件。
- NDK
- 我们取消了对 armeabi-v7a-hard ABI 的支持。如需了解详情,请参阅此说明。
- 移除了 Gingerbread 之前的平台级别的所有 sysroot。我们在 r11 中就已不再为其提供支持,但并没有切实将其移除。
- 在 ARM32 上使用 c++_shared 时进行的异常处理现在大多都能够正常完成。展开程序现在会链接到每个链接对象,而非链接到 libc++ 本身。如需详细了解此异常处理,请参阅已知问题。
- 删减了默认编译器标志。
(问题 27)。
- 如需了解有关这些变更的完整信息,请参阅此变更列表。
- 添加了独立工具链的 Python 实现:
build/tools/make_standalone_toolchain.py
。- Windows 用户不再需要 Cygwin 即可使用此功能。
- 我们将在 r13 中移除 Bash 样式,因此请立即测试新类型。
- 默认情况下,系统会为 Clang 调试版本启用
-fno-limit-debug-info
。此变更应该可以改进 LLDB 的可调试性。 --build-id
现已默认处于启用状态。- 版本号现在会显示在原生代码崩溃报告中,以便您轻松地判断运行的是哪个代码版本。
NDK_USE_CYGPATH
应该不会再导致 libgcc 方面的问题。(Android 问题 195486)-Wl
、--warn-shared-textrel
和-Wl,--fatal-warnings
选项现已默认处于启用状态。如果您有共享的文本重定位,则您的应用无法在 Android 6.0(API 级别 23)或更高版本中加载。系统从未允许针对 64 位应用使用文本重定位。- 预编译头文件的效果应该会更好。(问题 14 和问题 16)
- 移除了无法访问的 ARM(非 Thumb)STL 库。
- 向 android-24 添加了 Vulkan 支持。
- 向 android-24 添加了 Choreographer API。
- 针对采用
INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED
或更高级别的设备添加了libcamera2
API。如需了解详情,请参阅相机特征。 - Clang
- Clang 已更新至 3.8svn(r256229,版本 2812033)。
- 32 位 Windows 软件包中的
clang.exe
和clang++.exe
可执行文件实际为 64 位。32 位可执行文件的名称为clang_32.exe
。
- 32 位 Windows 软件包中的
- GCC
- 已与 ChromeOS GCC @ google/gcc-4_9 r227810 同步。
- 从 ToT (r231296) 向后移植了覆盖范围排错程序补丁程序。
- 修复了 libatomic,以避免使用
ifuncs
。(问题 31) - Binutils
- 将“找到并修复了 Erratum 843419”信息性消息设为了静音。
- 引入了选项
--long-plt
,以修复在链接大型 arm32 二进制文件时发生的内部链接器错误。 - 针对 AArch64 修复了错误的运行时存根。此错误会导致针对超大 DSO 计算的跳转地址有误。
- 引入了默认选项
--no-apply-dynamic
,以解决早期 Android 版本中存在的动态链接器 bug。 dynamic_cast
的 NDK r11 KI 无法与 Clang 配合使用。我们修复了 x86、stlport_static
和优化问题。- GDB
- 已更新至 GDB 7.11。如需了解详情,请参阅 GDB 新闻页面。
- 修复了
ndk-gdb.py
方面的一些错误。 - 已知问题
- x86 ASAN 仍无法正常运行。如需了解详情,请参阅有关此变更列表的讨论。
c++_shared
异常展开仍对 Android 2.3(API 级别 9)或 Android 4.0(API 级别 14)中的 ARM 无效。- 尽管存在 android-24,但仍未公开适用于 Android 6.0(API 级别 23)和 Android 7.0(API 级别 24)的 Bionic 头文件和库。这些平台仍然使用 Android 5.0(API 级别 21)头文件和库(并非从 r11 回归)。
- RenderScript 工具不存在(并非从 r11 回归)。(问题 7)
- 此变更记录并未详尽列出所有未解决的 bug。
__thread
这次应该能够真正起作用。
Android NDK r12(2016 年 6 月)
- 下载
- 请从此处下载此归档版本。
- 通告
ndk-build
命令在即将发布的版本中将默认使用 Clang。我们会在之后的版本中移除 GCC。- 我们会在即将发布的版本中移除
make-standalone-toolchain.sh
脚本。如果您使用的是此脚本,请计划尽快迁移到make_standalone_toolchain.py
。 - NDK
- 取消了对 armeabi-v7a-hard ABI 的支持。如需了解相关说明,请参阅此文档。
- 移除了 Android 2.3(API 级别 9)之前的平台级别的所有 sysroot。我们在 NDK r11 中就已不再为其提供支持,但没有切实将其移除。
- 更新了在 ARM32 上使用 c++_shared 时的异常处理,以便让大多数处理都能够正常完成(请参阅已知问题)。展开程序现在会链接到每个链接对象,而非链接到 libc++ 本身。
- 删减了默认编译器标志(NDK 问题 27)。您可以在变更 207721 中查看这项更新的详情。
- 在
build/tools/make_standalone_toolchain.py
中添加了独立工具链的 Python 实现。在 Windows 中,您不再需要 Cygwin 即可使用此功能。请注意,我们会在即将发布的版本中移除 Bash 样式,因此请立即测试新类型。 - 将 Clang 调试版本配置为了让
-fno-limit-debug-info
选项默认处于启用状态。此变更有助于更好地使用 LLDB 进行调试。 - 启用了
--build-id
作为默认选项。此选项会让标识符显示在原生代码崩溃报告中,以便您轻松地判断运行的是哪个代码版本。 - 修复了
NDK_USE_CYGPATH
问题,使其不会再导致 libgcc 方面的问题(问题 195486)。 - 启用了以下选项作为默认选项:
-Wl,--warn-shared-textrel
和-Wl,--fatal-warnings
。如果您有共享的文本重定位,则您的应用无法在 Android 6.0(API 级别 23)或更高版本中加载。请注意,系统从未允许针对 64 位应用使用此配置。 - 修复了一些问题,以便让预编译头文件的效果更好(NDK 问题 14、NDK 问题 16)。
- 移除了无法访问的 ARM(非 Thumb)STL 库。
- 向 android-24 添加了 Vulkan 支持。
- 向 android-24 添加了 Choreographer API。
- 针对支持
INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED
功能级别或更高级别的设备添加了 libcamera2 API。如需了解详情,请参阅CameraCharacteristics
参考文档。 - Clang
- Clang 已更新至 3.8svn(r256229,版本 2812033)。32 位 Windows 软件包中的
clang.exe
和clang++.exe
可执行文件实际为 64 位。32 位可执行文件的名称为clang_32.exe
。 - 修复了
__thread
,这次能够真正起作用。 - GCC
- 编译器已与 ChromeOS GCC @ google/gcc-4_9 r227810 同步。
- 从 ToT (r231296) 向后移植了覆盖范围排错程序补丁程序。
- 修复了
libatomic
,以避免使用 ifuncs(NDK 问题 31)。 - Binutils
- 将“找到并修复了 Erratum 843419”信息性消息设为了静音。
- 引入了选项
--long-plt
,以修复在链接大型 arm32 二进制文件时发生的内部链接器错误。 - 针对
AArch64
修复了错误的运行时存根。此错误会导致针对超大动态共享对象 (DSO) 计算的跳转地址有误。 - 引入了默认选项
--no-apply-dynamic
,以解决早期 Android 版本中存在的动态链接器 bug。 - 修复了 NDK r11 的一个已知问题,即
dynamic_cast
无法与 Clang、x86、stlport_static 和优化策略配合使用。 - GDB
- 更新到了 GDB 7.11 版。如需详细了解此版本,请参阅 GDB 新闻。
- 修复了
ndk-gdb.py
脚本中的一些错误。 - 已知问题
- x86 AddressSanitizer (ASAN) 目前无法运行。如需了解详情,请参阅问题 186276。
c++_shared
异常展开对 Android 2.3(API 级别 9)或 Android 4.0(API 级别 14)中的 ARM 无效。- 尽管存在 android-24,但仍未公开适用于 Android 6.0(API 级别 23)及更高版本的 Bionic 头文件和库。这些平台仍然使用 Android 5.0(API 级别 21)头文件和库,这与 NDK r11 一致。
- RenderScript 工具不存在,这与 NDK r11 一致。(NDK 问题 7)
NdkCameraMetadataTags.h
头文件中意外列出了相机元数据标记枚举值ACAMERA_STATISTICS_LENS_SHADING_CORRECTION_MAP
,此值将在下一版本中移除。请改为使用ACAMERA_STATISTICS_LENS_SHADING_MAP
值。
Android NDK r11c(2016 年 3 月)
Android NDK r11b(2016 年 3 月)
- NDK
- Clang
-
- Errata
- 与我们在 r11 版本说明中报告的情况相反,
__thread
不起作用。这是因为,我们发布的 Clang 版本缺少针对模拟 TLS 支持的 bug 修复。
Android NDK r11(2016 年 3 月)
- Clang
-
- 重要通告
- 新增
- Clang 现在为模拟 TLS 提供支持。
- 编译器现在通过使用特定于线程的 pthread 数据模拟 ELF TLS 来支持
__thread
。 - C++11
thread_local
在某些情况下可以起作用,但不适用于具有重要析构函数的数据,因为在这些情况下需要来自 libc 的支持。在 Android 6.0(API 级别 23)或更新版本上运行时,此限制不适用。 - 从共享库访问 TLS 变量时,模拟 TLS 尚不能与 Aarch64 配合使用。
- 编译器现在通过使用特定于线程的 pthread 数据模拟 ELF TLS 来支持
- Clang 现在为模拟 TLS 提供支持。
- GCC
-
- 重要通告
- 现已弃用 NDK 中的 GCC,转为使用 Clang。
- NDK 既不会升级至 5.x,也不会接受非关键向后移植。
- 我们将根据具体情况,对 4.9 中的误编译和内部编译器错误进行维护。
- 移除
- 移除了 GCC 4.8。所有目标现在都使用 GCC 4.9。
- 其他变更
- 已将 google/gcc-4_9 同步到 r224707。之前,google/gcc-4_9 与 r214835 同步。
- NDK
-
- 重要通告
- NDK 软件包中不再包含示例。这些示例改为在 GitHub 中提供。
- NDK 软件包中不再包含文档。此文档改为在 Android 开发者网站中提供。
- 新增
- 向
android-23
添加了原生跟踪 API。 - 向
android-23
添加了原生多网络 API。 - 从 API 级别 21 开始,启用了 libc、m 和 dl,以提供带版本编号的符号。
- 向 API 级别 N 添加了 Vulkan 头文件和库。
- 向
- 移除
- 取消了对
_WCHAR_IS_8BIT
的支持。 - 移除了 sed。
- 移除了 mclinker。
- 移除了 Perl。
- 从所有版本的 NDK libc、m 和 dl 中移除了这些库的平台版本不支持的所有符号。
- 部分取消了对 mips64r2 的支持。余下部分会在将来进行移除。
- 取消了对
- 其他变更
- 将 ARM 独立工具链更改为默认使用 arm7。
- 您可以恢复旧行为,只需将
-target
选项指定为armv5te-linux-androideabi
即可。
- 您可以恢复旧行为,只需将
- 将构建系统更改为针对平台 include 文件使用
-isystem
。- Bionic 所引起的警告不再中断应用构建。
- 修复了在二进制文件通过 gabi++ 抛出异常时发生的分段错误。(问题 179410)
- 将 libc++ 的内联命名空间更改为了
std::__ndk1
,以避免发生与平台 libc++ 相关的 ODR 问题。 - 所有的 libc++ 库现在都使用 libc++abi 进行编译。
- 将默认
APP_PLATFORM
提升到了 Gingerbread。- 预计未来版本不再支持 Froyo 及更旧版本。
- 将 ARM 独立工具链更改为默认使用 arm7。
- 针对 64 位更新了 gabi++
_Unwind_Exception
结构。 - 向 cpufeatures 添加了以下功能:
- 检测 SSE4.1 和 SSE4.2。
- 检测 x86_64 上的 CPU 功能。
- 将 libc++abi 更新到了上游 r231075。
- 从 ToT Bionic 更新了
byteswap.h
、endian.h
、sys/procfs.h
、sys/ucontext.h
、sys/user.h
和uchar.h
。 - 在所有 API 级别之间同步了
sys/cdefs.h
。 - 针对 arm 修复了
fegetenv and fesetenv
。 - 针对 mips64 和 x86_64 修复了
crtend_*
的结束指针大小/对齐方式。
- 重要通告
- Binutils
-
- 新增
- 添加了一个新选项:
--pic-veneer
。
- 添加了一个新选项:
- 移除
- 32 位的 Windows 软件包不再包含 ld.gold。您可以改为获取 64 位 Windows 软件包中的 ld.gold。
- 变更
- 统一了 Android 和 ChromiumOS 之间的 binutils 源代码。如需详细了解此变更,请参阅此处的注释。
- 针对 aarch64 改进了 Gold 的可靠性。在链接时,请使用
-fuse-ld=gold
,以使用 gold 替代 bfd。下一版本可能会切换默认值。 - 缩短了针对 Gold ARM 后端的大型二进制文件的链接时间(对于可调试的 Chrome 浏览器,最多可将链接时间缩短 50%)。
- 新增
- GDB
-
- 移除
- 移除了 ndk-gdb,改为使用 ndk-gdb.py。
- 变更
- 将 gdb 更新到了 7.10 版。
- 改进了性能。
- 改进了错误消息。
- 修复了相对项目路径。
- 已阻止 Ctrl-C 终止后台的 gdbserver。
- 改进了 Windows 支持。
- 移除
Android NDK r10e(2015 年 5 月)
- 下载
- 请从此处下载此归档版本。
- 重要变更:
-
- 将 Cortex-A53 Erratum 843419 解决方法集成到了
aarch64-linux-android-4.9
链接器中。如需详细了解此解决方法,请参阅针对 cortex-a53 erratum 843419 的解决方法。 - 添加了 3.6;
NDK_TOOLCHAIN_VERSION=clang
现在默认选择此版本的 Clang。 - 移除了 Clang 3.4。
- 移除了 GCC 4.6。
- 在
ld.gold
中针对所有架构实现了多线程支持。现在,它可以在支持或不支持多线程的情况下进行链接;默认情况是不支持多线程。- 要在支持多线程的情况下进行编译,请使用
--threads
选项。 - 若要在不支持多线程的情况下进行编译,请使用
--no-threads
选项。
- 要在支持多线程的情况下进行编译,请使用
- 针对所有架构将 GDB/gdbserver 升级到了 7.7。
- 移除了用于 32 位 Darwin 的 NDK 软件包。
- 将 Cortex-A53 Erratum 843419 解决方法集成到了
- 重要的 bug 修复:
-
- 修复了主线程外存在 OpenMP 循环时发生崩溃的问题。
- 修复了在以下情况下发生的 GCC 4.9 内部编译器错误 (ICE):用户声明了
#pragma GCC optimize ("O0")
,但在命令行中指定了不同的优化级别。pragma
优先。 - 修复了过去经常导致崩溃并显示以下错误消息的错误:
in add_stores, at var-tracking.c:6000
- 针对 LLVM 自动矢量化会生成
llvm.cttz.v2i64()
(此指令在 ARM 指令集中没有对应的指令)的 Clang 3.5 问题实现了解决方法。
- 其他的 bug 修复:
-
- 修复了以下头文件和库方面的问题:
- 修复了
media/NdkMediaDrm.h
中的PROPERTY_*
。 - 修复了
mips64
的sys/ucontext.h
。 - 取消了针对
__builtin_isnan
和__builtin_isinf
的 Clang 版本检查。 - 添加了
android-21/arch-mips/usr/include/asm/reg.h
和android-21/arch-mips64/usr/include/asm/reg.h
。 - 修复了 GCC 4.9 针对 x86 生成的数组边界误警告,并重新启用了 GCC 4.9 针对 ARM 生成的数组边界警告。针对 ARM 的警告之前已无条件停用。
- 针对
mips
和mips64
修复了 Clang 3.5,以便创建可写的.gcc_except_table
部分,从而与 GCC 行为相匹配。此变更可让您避免收到以下关于链接器的警告:.../ld: warning: creating a DT_TEXTREL in a shared object
- 针对在 Clang 为
mips64
进行编译时会导致崩溃的compiler-rt
问题向后移植了修复。如需了解详情,请参阅 LLVM 问题 20098。 - 修复了非 ASCII 注释中发生 Clang 3.5 崩溃的问题。(问题 81440)
- 修复了
stlport collate::compare
,以返回-1
和1
。之前,其会返回任意的带符号数。 - 修复了 64 位 ABI 的
ndk-gdb
。(问题 118300) - 修复了 RenderScript 的 HelloComputeNDK 示例在 Android 4.4(Android API 级别 19)中引起崩溃的问题。如需了解详情,请参阅此页面。
- 修复了 GCC 的
libc++ __wrap_iter
。如需了解详情,请参阅 LLVM 问题 22355。 - 修复了对 ABI
x86_64
的.asm
支持。 - 实现了针对 GCC 4.8
stlport
问题的解决方法。(问题 127773) - 从 Windows 的项目路径中移除了尾部的目录分隔符
\\
。(问题 160584) - 修复了在通过从
gradle
执行ndk-build.cmd
命令来编译单个.c
文件时出现no rule to make target
错误的问题。(问题 66937) - 添加了以下主机工具链中缺少的
libatomic.a
和libgomp.a
库:aarch64-linux-android-4.9
mips64el-linux-android-4.9
mipsel-linux-android-4.9
x86_64-4.9
- 其他变更:
-
- 为
aarch64
添加了ld.gold
。默认链接器仍为ld.bfd
。要明确启用ld.gold
,请将-fuse-ld=gold
添加到LOCAL_LDFLAGS
或APP_LDFLAGS
变量。 - 使用
binutils-2.25
编译了 MIPS 和 MIPS64 工具链,以提供经过改进的 R6 支持。 - 将
-fstandalone-debug
(完整调试信息)设为了 Clang 的默认选项。 - 针对 GCC 4.9、Clang 3.5 和 Clang 3.6 的 ARM、AArch64、X86 和 X86_64 工具链,将
-fstack-protector
替换为了-fstack-protector-strong
。 - 向
ndk-gdb
添加了--package
命令行开关,以允许构建系统替换软件包名称。(问题 56189) - 针对 MIPS 废弃了
-mno-ldc1-stc1
。此选项可能无法与新的-fpxx
和-mno-odd-spreg
选项配合使用,可能也无法与 FPXX ABI 配合使用。 - 为
cpu-features
添加了 MIPS MSA 和 R6 检测。
- 为
Android NDK r10d(2014 年 12 月)
- 重要变更:
-
- 已将 GCC 4.8 设为所有 32 位 ABI 的默认 GCC。弃用了 GCC 4.6,并会在下一版本中将其移除。若要恢复之前的行为,请将
NDK_TOOLCHAIN_VERSION=4.6
添加到 ndk-build,或在命令行中执行make-standalone-toolchain.sh
时添加--toolchain=arm-linux-androideabi-4.6
。GCC 4.9 仍为 64 位 ABI 的默认 GCC。 - 阻止了所有 x86[_64] 工具链默认添加
-mstackrealign
。NDK 工具链会假设进行 16 字节堆栈对齐。默认使用的工具和选项会强制执行此规则。用户编写汇编代码时必须保持堆栈对齐,并确保其他编译器也遵循此规则。 (GCC 错误 38496) - 针对 ARM 和 x86 ABI 的 Clang 3.5 支持添加了 AddressSanitizer 功能。如需详细了解此变更,请参阅 AddressSanitizer 项目。
- 从 API 级别 21 开始,引入了在构建时使用
-fPIE -pie
的要求。在 API 级别 16 及更高级别中,ndk-build 在编译时使用PIE
。此变更会产生诸多影响,我们在开发者预览问题 888中讨论了这些影响。这些影响不适用于共享库。
- 已将 GCC 4.8 设为所有 32 位 ABI 的默认 GCC。弃用了 GCC 4.6,并会在下一版本中将其移除。若要恢复之前的行为,请将
- 重要的 bug 修复:
-
- 在 aarch64-linux-android-4.9 链接器中进行了与 A53 Errata #835769 相关的更多修复。其中,当指定
-mfix-cortex-a53-835769
(默认处于启用状态)时,GCC 会传递新选项--fix-cortex-a53-835769
。 如需了解详情,请参阅此 binutils 消息和此 binutils 消息。 - 记录了在 API 级别 21 中出现的 libc++
sscanf/vsscanf
挂起问题的修复。此修复本身已在 r10c 中实现。(问题 77988) - 修复了当指定
-Os
时,GCC 4.9 发生 AutoFDO (-fauto-profile
) 崩溃的问题。(问题 77571)
- 在 aarch64-linux-android-4.9 链接器中进行了与 A53 Errata #835769 相关的更多修复。其中,当指定
- 其他的 bug 修复:
-
- 修复了以下头文件和库方面的问题:
- 向 API 级别 16 添加了
posix_memalign
。此外,还针对 API 级别 16 到 19,在stdlib.h
中添加了原型。(问题 77861) - 修复了
stdatomic.h
,使其仅针对 C++11 包含<atomic>
。 - 修改了以下头文件以供单独使用:
sys/user.h
以及针对 API 级别 21 的gl2ext.h
、dlext.h
、fts.h
、sgidefs.h
。 - 修改了
sys/user.h
,将mxcsr_mask
重命名为mxcr_mask
,并将u_ar0
的数据类型 从 - 将
sysconf()
返回值类型从int
更改为了long
。 - 修复了 ndk-build 对
LOCAL_ARM_MODE
的thumb
的处理:在 r10d 中,除非适用以下条件之一,否则 ndk-build 默认添加LOCAL_LDFLAGS+=-mthumb
: - 您已将
LOCAL_ARM_MODE
设为等于arm
。 - 您正在进行调试构建(使用
APP_OPTIM=debug
和包含android:debuggable="true"
的AndroidManifest.xml
等设置),此时 ARM 模式为默认模式,以保持与早期工具链兼容性。(问题 74040) - 修复了 ndk-build 中的
LOCAL_SRC_FILES
,以使用 Windows 绝对路径。(问题 74333) - 从 ndk-gdb 中移除了特定于 Bash 的代码。(问题 73338)
- 从
make-standalone-toolchain.sh
中移除了特定于 Bash 的代码。(问题 74145) - 修订了与针对
System.loadLibrary()
传递依赖项的修复有关的文档。(问题 41790) - 修复了阻止 64 位软件包在 Ubuntu 14.04 和 OS X 10.10 (Yosemite) 上解压缩的问题。(问题 78148)
- 修复了
LOCAL_PCH
问题,以改进 Clang 支持。(问题 77575) - 澄清了 ld.gold 发出的“需要可执行堆栈”警告。(问题 79115)
unsigned long
更改为 struct user_regs_struct*。
Android NDK r10c(2014 年 10 月)
- 重要变更:
-
- 对下载结构进行了以下变更:
- 现在,每个软件包都同时包含用于其各自平台的 32 位和 64 位头文件、库及工具。
- 无需再单独下载包含调试信息的 STL 库。
- 将之前名为
Android-L
的所有内容更改为了正式版名称:android-21
。 - 通过衍合到 GCC 代码库的
google
分支更新了 GCC 4.9。与 GCC 4.9 上游版本的主要差别包括: -O2
选项现在会开启矢量化,不会进行循环剥离,但会更积极地展开。- 增强了 FDO 和 LIPO
- 向所有主机添加了 Clang 3.5 支持:
NDK_TOOLCHAIN_VERSION=clang
现在会选择 Clang 3.5。请注意: - ARM 和 x86 默认使用集成的编译器。如果这样会引起任何问题,请使用
-fno-integrated-as
解决问题。 - Clang 3.5 会针对未使用的标志(例如,GCC 支持的
-finline-functions
选项)发出更多警告。 - 在使用 ART 作为虚拟机的 Android 5.0 设备上进行调试时,可以通过指定
art-on
选项进入 ART 调试模式。如需了解详情,请参阅 NDK 所在目录中的prebuilt/common/gdb/common.setup
。 - 取消了对 Clang 3.3 的支持。
- 弃用了 GCC 4.6,并且可能在未来版本中将其移除。
- 将 mclinker 更新为了支持相同代码折叠(“ICF”)的 2.8。使用
--icf
选项指定 ICF。 - 拓宽了 x86 和 x86_64 中的
arm_neon.h
支持,涵盖约 93% 的 NEON 内建函数。如需详细了解 NEON 支持,请执行以下操作:- 转到“NDK 编程人员指南”(
docs/Programmers_Guide/html/
),然后依次转到“架构和 CPU”>“Neon”查看相关信息。 - 查看
samples/
中经过更新的hello-neon
示例。 - 查看从 ARM NEON 移植到 Intel SSE 的 Intel 指南。
- 转到“NDK 编程人员指南”(
- 记录了在
headers/libs/android-21
中对_FORTIFY_SOURCE
的支持,_FORTIFY_SOURCE 在 r10(当时android-21
仍称为Android-L
)中就出现了,但未提供文档。
如需了解详情,请参阅下面的“重要问题修复”。
从使用 GCC 的项目进行迁移时,您可以使用
-Wno-invalid-command-line-argument
和-Wno-unused-command-line-argument
来忽略未使用的标志,直至您能够确定针对它们的长期处理方法为止。 - 重要的 bug 修复:
-
- 修复了 GCC4.9/aarch64 的内部编译器错误,此错误会导致显示以下错误消息(问题 77564):
- 修复了 GCC4.9/arm 生成错误代码的问题。(问题 77567)
- 修复了 GCC4.9/mips 的内部编译器错误,此错误涉及内联汇编。(问题 77568)
- 修复了 GCC4.9/arm 针对
x = (cond) ? y : x
生成错误代码的问题。(问题 77569) - 修复了 GCC4.9/aarch64 和 Clang3.5/aarch64,以作为 Cortex-A53 erratum (835769) 问题的默认解决方法。您可以通过指定
-mno-fix-cortex-a53-835769
停用此解决方法。
internal compiler error: in simplify_const_unary_operation, at simplify-rtx.c:1539
- 其他的 bug 修复:
-
- 对
android-21
进行了以下头文件和库方面的修复:- 添加了更多 TV 键码:
android/keycodes.h
- 向
android/sensor.h
添加了更多常量以及以下 6 个新的传感器函数:ASensorManager_getDefaultSensorEx
、ASensor_getFifoMaxEventCount
、ASensor_getFifoReservedEventCount
、ASensor_getStringType
、ASensor_getReportingMode
和ASensor_isWakeUpSensor
。 - 修复了
stdatomic.h
以改进与 GCC 4.6 的兼容性,并提供对<atomic>
头文件的支持。 - 向所有 API 级别添加了
sys/ucontext.h
和sys/user.h
。signal.h
头文件现在包含<sys/ucontext.h>
。您可以移除所有现有的struct ucontext
定义。 - 向 API 级别 17、18 和 19 添加了
posix_memalign
。 - 向所有架构添加了以下函数:
android_set_abort_message
、posix_fadvise
、posix_fadvise64
、pthread_gettid_np
。 - 向
native-media/AndroidManifest.xml
示例添加了所需的权限。(问题 106640) - 向 API 级别 21 添加了
clock_nanosleep
和clock_settime
。(问题 77372) - 从所有架构中移除了以下符号:
get_malloc_leak_info
、free_malloc_leak_info
、__srget
、__swbuf
、__srefill
、__swsetup
、__sdidinit
、__sflags
、__sfp
、__sinit
、__smakebuf
、__sflush
、__sread
、__swrite
、__sseek
、__sclose
、_fwalk
、__sglue
、__get_thread
、__wait4
、__futex_wake
、__open
、__get_tls
、__getdents64
和dlmalloc
。 - 从 64 位架构中移除了以下函数:
basename_r
、dirname_r
、__isthreaded
、_flush_cache
(mips64)。 - 从 32 位架构中移除了以下函数:
__signalfd4
。 - 将以下函数中的第 3 个参数的类型从
size_t
更改为int
:strtoll_l
、strtoull_l
、wcstoll_l
和wcstoull_l
。 - 对 64 位架构恢复了以下函数:
arc4random
、arc4random_buf
和arc4random_uniform
。 - 将
cxa_*
以及new
和delete
运算符移回了libstdc++.so
。此变更会恢复 r9d 行为;之前的 r10 版本包含占位符文件。
- 添加了更多 TV 键码:
- 在 GCC 4.8 和 4.9 中恢复了对 mips 的 MXU 支持。r10 和 r10b 未提供这项支持,因为这些版本的 GCC 是采用不支持 MXU 的 binutils-2.24 进行编译的。现在支持 MXU 了。
- 修复了
make-standalone-toolchain.sh
中的--toolchain=
,它现在可以适当支持使用指定 Clang 版本的后缀。 - 修复了 libc++/armeabi
strtod()
函数。 - 对
docs/
中的 NDK 文档进行了修复。
- 对
- 其他变更:
-
- 增强了
cpu-features
以检测对以下指令集的 ARMv8 支持:AES、CRC32、SHA2、SHA1 和 64 位 PMULL/PMULL2。(问题 106360) - 将 ndk-build 修改为使用
*-gcc-ar
,后者可在 GCC 4.8、GCC 4.9 和 Clang 中使用。Clang 会指定 *-gcc-ar,而不是*-ar
。此设置有助于改进 LTO 支持。 - 从 GCC 编译器中移除了
include-fixed/linux/a.out.h
和include-fixed/linux/compiler.h
头文件。(问题 73728) - 修复了在 Mac OS X 上使用 GCC 4.8 时有关
-flto
的问题。错误消息如下: - 修复了
build-binary.mk.
中的拼写错误(问题 76992)
.../ld: error: .../libexec/gcc/arm-linux-androideabi/4.9/liblto_plugin.so Symbol not found: _environ
- 增强了
- 重要已知问题:
-
- 在 GCC4.9 中指定 -Os (
-fauto-profile
) 可能会导致崩溃。(问题 77571)
- 在 GCC4.9 中指定 -Os (
Android NDK r10b(2014 年 9 月)
- 重要说明:
-
- 由于可下载软件包有 512MB 的大小限制,因此下列 32 位项目不包含在 32 位的 NDK 下载软件包中,而是包含在 64 位的下载软件包中:
- Android-L 头文件
- GCC 4.9
- 目前,NDK 提供的唯一 RenderScript 支持适用于 32 位 RenderScript 与 Android 4.4(API 级别 19)组合。您无法使用任何其他 RenderScript(32 位或 64 位)与 Android 版本的组合来构建 HelloComputeNDK(唯一的 RenderScript 示例)。
- 若要编译 native-codec,您必须使用 64 位的 NDK 软件包,其中包含所有的 Android-L 头文件。
- 重要的 bug 修复:
- 其他的 bug 修复:
-
- 从所有版本的 GCC 的
include-fixed/
目录中移除了stdio.h
。(问题 73728。) - 从
platforms/android-L/arch-*/usr/include/linux/netfilter*/
目录中的 Windows 软件包中移除了重复的头文件。(问题 73704。) - 修复了阻止 Clang 编译 HelloComputeNDK 的问题。
- 修复了 atexit。(问题 66595。)
- 对
docs/
和sources/third_party/googletest/README.NDK
中的文档进行了各种修复。(问题 74069。) - 对 Android-L 头文件进行了下列修复:
- 向
ctype.h
和wchar.h
中添加了下列函数:dn_expand()
、grantpt()
、inet_nsap_addr()
、inet_nsap_ntoa()
、insque()
、nsdispatch()
、posix_openpt()
、__pthread_cleanup_pop()
、__pthread_cleanup_push()
、remque()
、setfsgid()
、setfsuid()
、splice()
、tee()
、twalk()
(问题 73719)和 42*_l()
函数。 - 将
cmsg_nxthdr
重命名为了__cmsg_nxthdr
。 - 移除了
__libc_malloc_dispatch
。 - 将
ptrace()
原型更改为了long ptrace(int, ...);
。 - 移除了
sha1.h
。 - 扩展了
android/dlext.h
中的android_dlextinfo
。 - 针对
stdlib.h
、time.h
、wchar.h
和complex.h
中接收或返回浮点型或双精度类型值的函数,对__NDK_FPABI__
添加了注释。
- 从所有版本的 GCC 的
- 其他变更:
-
- 更新了
mipsel-linux-android-4.9
和mips64el-linux-android-4.9
,实现了新的多库目录布局,并提供对 gdb-7.7 的支持 - 增强了
cpu-features
以检测更多 arm64 功能。(变更列表 100339。)
- 更新了
Android NDK r10(2014 年 7 月)
- 重要变更:
-
- 添加了 3 个新的 ABI(均为 64 位):arm64-v8a、x86_64 和 mips64。 注意:
- GCC 4.9 是 64 位 ABI 的默认编译器。Clang 目前为 3.4 版。
NDK_TOOLCHAIN_VERSION=clang
可能不适用于 arm64-v8a 和 mips64。 - Android-L 是第一个具有 64 位支持的级别。请注意,此 API 级别是一个临时级别,仅适用于 L 预览版。在 L 版本中,我们会将其替换为实际的 API 级别号。
- 此版本现在包含针对
APP_ABI
的all32
和all64
设置。APP_ABI=all32
相当于APP_ABI=armeabi,armeabi-v7a,x86,mips
。APP_ABI=all64
相当于APP_ABI=arm64-v8a,x86_64,mips64
。APP_ABI=all
会选择所有 ABI。
- Android-L 中的新 GNU libstdc++ 包含所有
<tr1/cmath>
。在定义您自己的数学函数之前,请检查_GLIBCXX_USE_C99_MATH_TR1
中是否已存在同名的函数,以免链接器发生“多重定义”错误。 - 针对 ARMv8 内核更新了 cpu-features 库。现有 cpu-features 库可能无法检测到 ARMv8 平台上是否有 NEON。请使用新版本重新编译您的代码。
- 添加了新的
platforms/android-L/
API 目录。其中包括: - 已更新的 Bionic 头文件,但尚未从 Android API 级别 3 (Cupcake) 更改为 19 (KitKat)。此新版本(适用于级别 L)旨在实现与 AOSP 同步。
- 新的媒体 API 和 native-codec 示例。
- 更新了 SLES/OpenSLES 的
Android.h
头文件,使 AudioPlayer 支持单精度浮点音频格式。 - 对
libGLESv3.so.
的 GLES 3.1 和 AEP 扩展。 - 将 GLES2 和 GLES3 头文件更新到了最新官方 Khronos 版本。
- 向 32/64 位 ABI 添加了 GCC 4.9 编译器。如前所述,GCC 4.9 是 64 位 ABI 的默认(唯一)编译器。对于 32 位 ABI,您必须明确启用 GCC 4.9,因为 GCC 4.6 仍为默认编译器。
- 对于 ndk-build,请通过将
NDK_TOOLCHAIN_VERSION=4.9
添加到Application.mk
,或从命令行将其导出为环境变量来启用 32 位 GCC 4.9 构建。 - 对于独立工具链,请在
make-standalone-toolchain.sh
脚本中使用--toolchain=
选项。例如:--toolchain=arm-linux-androideabi-4.9.
- 在 GCC 4.8/4.9 和 x86* 中将 GDB 升级到了 7.6 版。由于 GCC 4.6 中的 GDB 仍为 GDB-7.3.x 版(ARM 和 MIPS 的默认版本),因此您必须设置
NDK_TOOLCHAIN_VERSION=4.8
或4.9
,以使 ndk-gdb 选择 GDB 7.6。 - 添加了
-mssse3
编译选项以提供 SSSE3 支持,并已将其设为 ABI x86 的默认版本(从 SSE3 升级)。Google 发布的映像不包含 SSSE3 指令。 - 已将 GCC 4.8 更新至 4.8.3。
- 已从 gabi++ 切换至 libc++abi,从而改善了 ARM libc++ EH 支持。如需了解详情,请参阅文档的“C++ 支持”部分。请注意:
- 对于 Clang 3.4 和 GCC 4.8,除语言区域之外的所有测试现在都会通过。如需了解详情,请参阅文档的“C++ 支持”部分。
- X86 和 MIPS libc++ 的 libc++ 库仍使用 gabi++。
- GCC 4.7 及更高版本现可使用 <atomic>。
- 如果您使用的是
<list>
,则必须添加-fno-strict-aliasing
,因为__list_imp::_end
不符合 TBAA 规则。(问题 61571。) - 从 GCC 4.6 开始,LIBCXX_FORCE_REBUILD:=true no 不再重新编译 libc++。重新编译需使用其他编译器。请注意,Clang 3.3 未经测试。
- mclinker 现为 2.7 版,并提供 aarch64 Linux 支持。
- 针对
LOCAL_PCH
指定的头文件添加了预编译头文件支持。(问题 25412)。
- 重要的 bug 修复:
-
- 修复了 libc++,因此现在可以编译
std::feof
等(问题 66668)。 - 修复了在某些 ABI armeabi libc++ 测试中导致崩溃的 Clang 3.3/3.4 原子库调用。
- 修复了 Clang 3.4 在读取预编译头文件时发生崩溃的问题。(问题 66657)。
- 修复了有关以下方面的 Clang 3.3/3.4
-O3
断言: - 修复了以下 Clang 3.3/3.4 崩溃:
llvm-3.2/llvm/include/llvm/MDBuilder.h:64: llvm::MDNode* llvm::MDBuilder::createBranchWeights(llvm::ArrayRef
(问题 57381)。): Assertion Weights.size() >= 2 && "Need at least two branch weights!" Assertion failed: (!Fn && "cast failed but able to resolve overload expression!!"), function CheckCXXCStyleCast, file Volumes/data/ndk-toolchain/src/llvm-3.3/llvm/tools/clang/lib/Sema/SemaCast.cpp, line 2018
。(问题 66950)。 - 修复了 libc++,因此现在可以编译
- 其他的 bug 修复:
-
- 修复了头文件:
- 将 32 位
ssize_t
修复为了int
,而非long int
。 - 修复了
WCHAR_MIN
和WCHAR_MAX
,使其根据其运行所在的架构采用适当的符号: - X86/MIPS:带符号。
- ARM:无符号。
- 要强制 X86/MIPS 默认为无符号,请使用
-D__WCHAR_UNSIGNED__
。 - 要强制
wchar_t
为 16 位,请使用-fshort-wchar
。 - 从 32 位
libc.so
中移除了不存在的符号,并添加了适用于 Android API 级别 12 及更高级别的pread64
、pwrite64
和ftruncate64
。(问题 69319)。如需了解详情,请参阅 AOSP 变更列表 94137 随附的提交消息。 - 修复了有关重新定义
putchar
的 GCC 警告。警告消息如下所示: - 修复了
make-standalone-toolchain.sh --stl=libc++
,以使其执行以下操作: - 修复了 GCC/Windows,从而在外部程序中派生进程时,只有在必要的情况下才将参数括在引号内。此变更可以降低超出 32K 长度限制的可能性。
- 修复了导致无法调整
APP_PLATFORM
环境变量的问题。 - 修复了 crazy_linker 中
IsSystemLibrary()
的实现,以使其使用strrchr()
(而非strchr()
)查找库路径的真实基名。 - 修复了 native-audio 无法以调试模式进行构建的问题。
- 修复了 gdb 无法输出极端浮点数的问题。(问题 69203)。
- 修复了 Clang 3.4 无法使用
-Wl,-shared
(与无编译问题的-shared
相反)进行编译的问题。问题在于,如果既不存在-shared
,也不存在-static
,那么 Clang 便会为 Android 目标添加-pie
。这种行为不正确,并会导致链接器指出-shared
与-pie
不能共存。
include/stdio.h:236:5: warning: conflicts with previous declaration here [-Wattributes] int putchar(int);
(变更列表 91185)。 - 其他变更:
-
- 向 x86 工具链添加了
arm_neon.h
,使其现在可模拟约 47% 的 Neon。目前不支持 64 位类型。如需了解详情,请参阅 x86 文档中有关 ARM Neon 内建函数支持的部分。 - 已将 ARM/GOT_PREL 优化(出现在从 GCC google 分支编译的 GCC 4.6 中)移植到 ARM GCC 4.8/4.9。此优化有时会降低访问全局变量时的指令计数。例如,请参阅
$NDK/tests/build/b14811006-GOT_PREL-optimization/
中的 build.sh 脚本。 - 添加了 STL gabi++、stlport 和 libc++ 的 ARM 版本。它们现在同时拥有 ARM 模式和 Thumb 模式。
- 现在,可以使用
--toolchain=x86_64-linux-android-4.9
(等同于--toolchain=x86_64-4.9
)调用 make-standalone-toolchain.sh 脚本。
- 向 x86 工具链添加了
Android NDK r9d(2014 年 3 月)
- 重要变更:
-
- 添加了对 Clang 3.4 编译器的支持。
NDK_TOOLCHAIN_VERSION=clang
选项现在会选择 Clang 3.4。GCC 4.6 仍为默认编译器。 - 添加了
APP_ABI=armeabi-v7a-hard
,并提供额外的多库选项-mfloat-abi=hard
。这些选项可以与 ARM GCC 4.6/4.8 和 Clang 3.3/3.4(其使用 4.8 版本的编译器、链接器和库)配合使用。使用这些选项时,请注意下列变更: - 执行
ndk-build
脚本时,请为 armeabi-v7a 目标添加下列选项: 构建的库会复制到TARGET_CFLAGS += -mhard-float -D_NDK_MATH_NO_SOFTFP=1 TARGET_LDFLAGS += -Wl,--no-warn-mismatch -lm_hard
libs/armeabi-v7a
。为了让 make 的行为符合预期,不得同时指定armeabi-v7a
和armeabi-v7a-hard
作为 make 目标(即,在 APP_ABI= 行上指定)。这样做会导致其中一项被忽略。请注意,APP_ABI=all
仍等同于armeabi armeabi-v7a x86 mips
。 make-standalone-toolchain.sh
脚本会复制/hard
目录下额外的库。请将上述CFLAGS
和LFLAGS
添加到 makefile 中,以便让 GCC 或 Clang 能够链接到/hard
中的库。- 添加了 yasm 编译器,以及适用于 x86 目标的
LOCAL_ASMFLAGS
和EXPORT_ASMFLAGS
标记。ndk-build
脚本使用prebuilts/*/bin/yasm*
编译具有.asm
扩展名的LOCAL_SRC_FILES
。 - 将 MClinker 更新到了 2.6.0,此版本添加了
-gc-sections
支持。 - 添加了实验性 libc++ 支持(上游 r201101)。请按照以下步骤使用此新功能:
- 在
Application.mk
中添加APP_STL := c++_static
或APP_STL := c++_shared
。您可以通过LIBCXX_FORCE_REBUILD := true
从源代码重新编译。 - 执行
make-standalone-toolchain.sh --stl=libc++
,以使用 libc++ headers/lib 创建独立工具链。
CPLUSPLUS-SUPPORT.html
。(问题 36496) - 在
- 添加了对 Clang 3.4 编译器的支持。
- 重要的 bug 修复:
-
- 修复了 GCC 4.6/4.8 ARM EABI 的意外异常处理程序抛出的未捕获问题。(GCC 问题 59392)
- 修复了 GCC 4.8,现在它可以正确地解析针对具有依赖型、非类型模板参数的模板的局部特化。(GCC 问题 59052)
- 向预编译的 Python 添加了更多模块(问题 59902):
- Mac OS X:
zlib
、bz2
、_curses
、_curses_panel
、_hashlib
、_ssl
- Linux:
zlib
、nis
、crypt
、_curses
和_curses_panel
- Mac OS X:
- 修复了 x86 和 MIPS gdbserver
event_getmsg_helper
。 - 修复了 RenderScript NDK 工具链中的各种问题,包括旧版设备的兼容性问题和 C++ 反射问题。
- 其他的 bug 修复:
-
- 头文件修复:
- 针对 Android API 级别 13 及更高级别修复了
android/asset_manager.h
中缺失#include <sys/types.h>
的问题。(问题 64988) - 针对 Android API 级别 14 及更高级别修复了
android/rect_manager.h
中缺失#include
的问题。 - 向
jni.h
中的JNI_OnLoad
和JNI_OnUnload
添加了JNICALL
。请注意,JNICALL
定义为__NDK_FPABI__
,如需了解详情,请参阅sys/cdefs.h
。 - 更新了下列头文件,现在无需手动包含其依赖项即可将其包含在内(问题 64679):
- 针对所有架构添加了
sys/cachectl.h
。MIPS 开发者现在可以包含此头文件,而无需编写#ifdef __mips__
。 - 通过向接受或返回浮点值或双精度值的函数添加
__NDK_FPABI__
,修复了platforms/android-18/include/android/input.h
。 - 修复了 MIPS
struct stat
,之前针对 Android API 级别 12 及更高级别将其错误地设为 64 位版的对应设置。这项错误设置是版本 r9c 中引入的回归。 - 针对 Android API 级别 9 及更低级别定义了
__PTHREAD_MUTEX_INIT_VALUE
、__PTHREAD_RECURSIVE_MUTEX_INIT_VALUE
和__PTHREAD_ERRORCHECK_MUTEX_INIT_VALUE
。 - 针对 API 18 及更高级别向 x86
libm.so
添加了scalbln
、scalblnf
和scalblnl
。 - 修复了
sources/android/support/include/iconv.h
中的拼写错误。(问题 63806)
android/tts.h EGL/eglext.h fts.h GLES/glext.h GLES2/gl2ext.h OMXAL/OpenMAXSL_Android.h SLES/OpenSLES_Android.h sys/prctl.h sys/utime.h
- 针对 Android API 级别 13 及更高级别修复了
- 将 gabi++
std::unexpected()
修复为调用std::terminate()
,以便为用户定义的std::terminate()
处理程序提供运行机会。 - 修复了 gabi++ 以捕获
std::nullptr
。 - 修复了 Teapot 和 MoreTeapots 示例:
- 通过将镜面反射变量更改为使用中等精度,解决了 Tegra 2 和 Tegra 3 芯片的问题。镜面反射强度值现在可以小于 1.0。
- 更改了示例,现在按下音量按钮可恢复沉浸模式,并使
SYSTEM_UI_FLAG_IMMERSIVE_STICKY
失效。屏幕旋转不会触发onSystemUiVisibilityChange
,因此不会恢复沉浸模式。
- 修复了
ndk-build
脚本以添加-rpath-link=$SYSROOT/usr/lib
和-rpath-link=$TARGET_OUT
,从而使用ld.bfd
链接可执行文件。(问题 64266) - 从所有 STL build 中移除了
-Bsymbolic
。 - 通过将
SHELL
设为环境变量(而非将其传递到忽略此设置的python.exe
)修复了ndk-gdb-py.cmd
。(问题 63054) - 修复了
make-standalone-toolchain.sh
脚本,使--stl=stlport
选项复制 gabi++ 头文件,而非对其进行符号链接;cmd.exe
和 MinGW shell 无法理解 cygwin 创建的符号链接。
- 头文件修复:
- 其他变更:
-
- 将执行权限应用到了之前仅供在
cmd.exe
shell 中使用的所有*cmd
脚本,以防开发者希望在 cygwin 中使用ndk-build.cmd
,而非推荐的ndk-build
脚本。 - 针对指定目标目录不存在的情况,通过移动而非复制,加快了
make-standalone-toolchain.sh
脚本的速度。
- 将执行权限应用到了之前仅供在
Android NDK r9c(2013 年 12 月)
这是一个仅修复 bug 的版本。
- 重要的 bug 修复:
-
- 修复了 GCC 4.8 ARM 中过早恢复堆栈指针的问题。此问题导致帧指针无法可靠地访问堆栈帧中的变量。(GCC 问题 58854)
- 修复了 GCC 4.8 libstdc++ 的一个问题,其中 std::nth_element 中的错误会导致生成代码时发生随机分段错误。(错误 62910)
- 修复了包含
-fuse-ld=mcld
的 cc1/cc1plus 中的 GCC 4.8 ICE,以确保不再发生以下错误:cc1: internal compiler error: in common_handle_option, at opts.c:1774
- 针对
__builtin
数学函数修复了-mhard-float
支持。如需持续了解使用 STL 修复-mhard-float
方面的信息,请跟进问题 61784。
- 其他的 bug 修复:
-
- 头文件修复:
- 将
poll.h
中的poll
原型更改为了poll(struct pollfd *, nfds_t, int);
。 - 针对 Android API 级别 12 和 19 向
libc.so
添加了utimensat
。现在 Android API 级别 12 到 19 的所有级别均包含这些库。 - 针对 Android API 级别 19,在
libc.so
中引入了futimens
。 - 针对 Android API 级别 8 及更高级别向
time.h
添加了缺失的clock_settime()
和clock_nanosleep()
。 - 在
time.h.
中添加了CLOCK_MONOTONIC_RAW, CLOCK_REALTIME_COARSE, CLOCK_MONOTONIC_COARSE, CLOCK_BOOTTIME, CLOCK_REALTIME_ALARM,
和CLOCK_BOOTTIME_ALARM
。 - 移除了过时的
CLOCK_REALTIME_HR
和CLOCK_MONOTONIC_HR.
。
- 将
- 在 Teapot、MoreTeapots 和
source/android/ndk_helper
示例中:- 对其进行了更改,以便其针对 armeabi-v7a 使用硬浮点 ABI。
- 对其进行了更新,以便在 Android API 级别 19 及更高级别中使用沉浸模式。
- 修复了
/system/lib/libdvm.so
中的Check_ReleaseStringUTFChars
导致在 x86 设备上发生崩溃的问题。
- 修复了通过符号链接引用 NDK 软件包时,cygwin 中发生的
ndk-build
故障问题。 - 修复了当
LOCAL_SRC_FILES
包含绝对路径时,Windowscmd.exe
中发生的ndk-build.cmd
故障问题。(问题 69992) - 修复了
ndk-stack
脚本,现在即使由于找不到例程、文件名或行号而无法解析帧,此脚本也会继续运行。在所有这些情况下,它都会输出??
。 - 修复了 windows-x64_64 目标的
ndk-stack
堆栈,不会再错误地将帧行与stack:
部分未包含pc
、eip
或ip
的行匹配。例如:I/DEBUG ( 1151): #00 5f09db68 401f01c4 /system/lib/libc.so
- 修复了 gabi++,以使其执行以下操作:
- 不使用 malloc() 分配 C++ 线程局部对象。
- 当 userdebug/eng Android 平台编译系统中的 libc.debug.malloc 为非零值时,避免 gabi++ 中发生死锁。
- 头文件修复:
- 其他变更:
-
- 添加了
LOCAL_EXPORT_LDFLAGS
。 - 引入了
NDK_PROJECT_PATH=null
设置,以用于将选项明确传递到ndk-build
的集成编译系统。使用此设置时,ndk-build
不会尝试查找NDK_PROJECT_PATH.
。此设置还会阻止变量从 NDK_PROJECT_PATH 衍生默认设置。因此,现在必须明确指定下列变量(及其默认值,如果有):NDK_OUT, NDK_LIBS_OUT, APP_BUILD_SCRIPT, NDK_DEBUG
(可选,默认为 0),以及Application.mk
中包含的其他APP_*
。 - 现在,可以用以逗号分隔的列表列举
APP_ABI
。例如:APP_ABI := "armeabi,armeabi-v7a"
- 可以通过使用
-g
选项,利用单独的可选软件包android-ndk-r9c-cxx-stl-libs-with-debugging-info.zip
中的调试信息重新编译所有 STL。此选项有助于ndk-stack
脚本改善整个 STL 中的堆栈转储。此变更不应影响剥离后最终文件的代码/大小。 - 增强了
hello-jni
示例,以便在编译时报告APP_ABI
。 - 在确定性模式(选项
-D
)下使用了ar
工具编译静态库。(问题 60705)
- 添加了
Android NDK r9b(2013 年 10 月)
- 重要变更:
-
- 针对 Android API 级别 18 及以下的所有级别更新了
include/android/*h
和math.h
,包括添加级别 13、15、16 和 17。如需了解添加的 API,请参阅变更 68012 和 68014 的提交消息。(问题 47150、58528 和 38423) - 添加了对 Android API 级别 19 的支持,包括 Renderscript 绑定。
- 在现有的 armeabi-v7a ABI 中添加了对
-mhard-float
的支持。如需了解相关详情及当前限制,请参阅tests/device/hard-float/jni/Android.mk
。 - 从 GNU Compiler Collection (GCC) 4.8 迁移到了 4.8.2,并添加了诊断颜色支持。若要启用诊断颜色,请设置
-fdiagnostics-color=auto
、-fdiagnostics-color=always,
或导出GCC_COLORS
,如下所示: 如需了解详情,请参阅 GCC 与语言无关的选项。GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
- 添加了两个新示例以演示 OpenGL ES 3.0 功能:Teapot 和 MoreTeapots。这些示例可在搭载 Android 4.1(API 级别 16)及更高版本的设备上运行。
- 弃用了 GCC 4.7 和 Clang 3.2 支持,并将在下一版本中将其移除。
- 针对 Android API 级别 18 及以下的所有级别更新了
- 重要的 bug 修复:
-
- 修复了 ARM GCC 4.6
thumb2
无法生成 16 位相对跳转表的问题。(GCC 问题) - 修复了
g++.dg/cpp0x/lambda/lambda-defarg3.C
上发生的 GCC 4.8 内部编译器错误 (ICE)。(变更 62770,GCC 问题) - 修复了 Windows 32 位
*-gdb.exe
可执行文件无法启动的问题。(问题 58975) - 修复了编译项目符号库时的 GCC 4.8 ICE。错误消息如下所示:
(问题 58916、 GCC 问题)internal compiler error: verify_flow_info failed
- 修改了 GDB/ARM build,以跳过序言代码中用于进行堆栈展开的
ARM.exidx
数据,并添加了一个命令 (set arm exidx-unwinding
) 来控制基于 exidx 的堆栈展开。(问题 55826) - 修复了不正确地重复使用 HI 和 LO 寄存器的 Clang 3.3 MIPS 编译器问题。
- 修复了
dbx_reg_number
中的 MIPS 4.7 ICE 问题。错误消息如下所示: (GCC 补丁)external/icu4c/i18n/decimfmt.cpp:1322:1: internal compiler error: in dbx_reg_number, at dwarf2out.c:10185
- 修复了 ARM GCC 4.6
- 其他的 bug 修复:
-
- 头文件修复
- 根据规范将 ARM
WCHAR_MIN
和WCHAR_MAX
修复为了无符号(X86/MIPS 版本有符号)。定义_WCHAR_IS_ALWAYS_SIGNED
以恢复旧行为。(问题 57749) - 修复了
include/netinet/tcp.h
以包含TCP_INFO
状态枚举。(问题 38881) - 修复了
cdefs_elh.h
宏_C_LABEL_STRING
,以便在使用 c++11 模式时停止在 GCC 4.8 工具链中生成警告。(问题 58135、问题 58652) - 从头文件
inttypes.h
中移除了不存在的imaxabs
和imaxdiv
函数。 - 修复了
pthread_exit()
返回值和pthread_self()
存在的问题。(问题 60686) - 添加了缺失的
mkdtemp()
函数,此函数已存在于bionic
头文件stdlib.h
中。
- 根据规范将 ARM
- 修复了在 Android API 级别 11 上使用 Clang 构建
samples/gles3jni
的问题。 - 修复了 MCLinker,以允许下列选项多次出现:
-gc-sections
和--eh-frame-hdr
。 - 修复了 MCLinker,以接受
--no-warn-mismatch
选项。 - 修改了
cpu-features
选项,不再假设所有 VFPv4 设备均支持 IDIV。现在,此选项仅向列入白名单的设备(包括 Nexus 4)添加 IDIV。(问题 57637) - 修复了对于事件预分派操作,
android_native_app_glue.c
不能正确记录错误的问题。 - 将
gabi++
terminate 和 unexpected_handler 上的所有操作修复为了具备线程安全性。 - 修复了 Clang
-integrated-as
选项的多个问题,使其能够通过ssax-instructions
和fenv
的测试。 - 修复了 GCC 4.6/4.7/4.8 编译器,甚至对静态可执行文件也可传递链接器选项
--eh-frame-hdr
。如需了解详情,请参阅 GCC 补丁程序。 - 修复了
CPU-ARCH-ABIS.html
中多余的撇号。如需了解详情,请参阅NDK-DEPENDS.html
。(问题 60142) - 修复了 Windows 上的 ndk-build 输出中多余的引号。(问题 60649)
- 修复了 Clang 3.3,以编译 ARM 的内置原子操作,例如
__atomic_fetch_add
、__atomic_fetch_sub
和__atomic_fetch_or
。 - 修复了自定义
vfprintf
的 Clang 3.3 ICE。(Clang 问题)
- 头文件修复
- 其他变更:
-
- 对所有 GCC 编译系统启用了 OpenMP。若要使用此功能,请在编译设置中添加下列标记:
如需查看代码示例,请参阅LOCAL_CFLAGS += -fopenmp LOCAL_LDFLAGS += -fopenmp
tests/device/test-openmp
- 大幅缩小了
ld.mcld
的大小(大小为 1.5MB,而ld.bfd
为 3.5MB,ld.gold
为 7.5MB),使速度提升约 20%。 - 添加了
LOCAL_CONLYFLAGS
和APP_CONLYFLAGS
,用于指定仅适用于 C 而不适用于 C++ 的选项。现有的LOCAL_CFLAGS
和APP_CFLAGS
也会用于 C++ 编译(避免大部分选项需要指定两次),因此-std=gnu99
等选项可能会在 g++ 构建中失败并发出警告,而在 clang++ 构建中则会发生错误。 - 添加了
gabi++
数组辅助函数。 - 修改了 GCC 编译系统,以使所有
libgcc.a
文件都使用-funwind-tables
进行编译,从而允许展开堆栈时经过先前已屏蔽的点,例如__aeabi_idiv0
。 - 利用新增的
-mmxu
选项,在 MIPS GCC4.6/4.7/4.8 中添加了 Ingenic MXU 支持。 - 扩展了 MIPS GCC4.6/4.7/4.8
-mldc1-sdc1
,以便同时控制 ldxc1/sdxc1。 - 添加了超级链接器。如需了解详情,请参阅
sources/android/crazy_linker/README.TXT
。 - 修复了
bitmap-plasma
,以便绘制到整个屏幕,而不是 200x200 像素区域。 - 通过创建指向相同文件的符号链接,将 Linux 和 Darwin 工具链大小减小了 25%。
- 对所有 GCC 编译系统启用了 OpenMP。若要使用此功能,请在编译设置中添加下列标记:
Android NDK r9(2013 年 7 月)
- 重要变更:
-
- 添加了对 Android 4.3(API 级别 18)的支持。如需了解详情,请参阅
STABLE-APIS.html
; 如需查看新的代码示例,请参阅samples/gles3jni/README
。 - 为 OpenGL ES 3.0 添加了头文件和库,OpenGL ES 3.0 受 Android 4.3(API 级别 18)及更高版本支持。
- 向 NDK 添加了 GNU Compiler Collection (GCC) 4.8 编译器。由于 GCC 4.6 仍为默认编译器,因此您必须明确启用此选项:
- 对于
ndk-build
编译系统,请导出NDK_TOOLCHAIN_VERSION=4.8
,或将其添加到Application.mk
中。 - 对于独立 build,请在
make-standalone-toolchain.sh
中使用--toolchain=
选项,例如:
--toolchain=arm-linux-androideabi-4.8
注意:
-Wunused-local-typedefs
选项由-Wall
启用。如果您使用编译时断言(例如第 311 行的sources/cxx-stl/stlport/stlport/stl/config/features.h
),请务必添加__attribute__((unused))
。如需了解详情,请参阅变更 55460注意:在 GCC 4.7 版本及更高版本中,ARM 编译器会针对 ARMv6 及更高版本的编译目标默认生成未对齐的访问代码。在面向不支持此功能的内核进行编译时,可能需要添加
-mno-unaligned-access
编译选项。 - 对于
- 添加了 Clang 3.3 支持。
NDK_TOOLCHAIN_VERSION=clang
编译选项现在默认选择 Clang 3.3。注意:GCC 4.4.3 和 Clang 3.1 已被废弃,并将在下一个 NDK 版本中被移除。
- 已将 GNU Project Debugger (GDB) 更新为支持 Python 2.7.5。
- 添加了 MCLinker 以支持 Windows 主机。由于
ld.gold
在可用时即成为默认设置,因此您必须在LOCAL_LDFLAGS
或APP_LDFLAGS
中添加-fuse-ld=mcld
才能启用 MCLinker。 - 添加了
ndk-depends
工具,可输出 ELF 库依赖项。如需了解详情,请参阅NDK-DEPENDS.html
。(问题 53486)
- 添加了对 Android 4.3(API 级别 18)的支持。如需了解详情,请参阅
- 重要的 bug 修复:
-
- 修复了
android_native_app_glue
中潜在的事件处理问题。(问题 41755) - 修复了 ARM/GCC-4.7 build,以便 NEON 加载和存储指令 VST 和 VLD 充分地对齐。(GCC 问题 57271)
- 修复了字符串字面量的常量负数索引值发生的 GCC 4.4.3/4.6/4.7 内部编译器错误 (ICE)。(问题 54623)
- 修复了使用对象地址进行常量初始化时发生的 GCC 4.7 分段错误。(问题 56508)
- 修复了使用 Boost 1.52.0 时
-O
值发生的 GCC 4.6 ARM 分段错误。(问题 42891) - 修复了
libc.so
和libc.a
,以支持wait4()
函数。(问题 19854) - 将 x86 libc.so 和 libc.a 文件更新为了包含
clone()
函数。 - 修复了
linker.list
文件为空或者未使用的LOCAL_SHORT_COMMANDS
错误。 - 修复了 Mac OS 上的 GCC MIPS build 以使用 CFI 指令,若没有这些指令,
ld.mcld --eh-frame-hdr
会频繁失败。 - 修复了
llvm/lib/VMCore/Value.cpp
中的 Clang 3.2 X86/MIPS 内部编译器错误。(变更 59021) - 修复了 GCC 4.7 64 位 Windows 编译器崩溃问题。(错误:
out of memory allocating 4294967280 bytes
)。 - 更新了
ndk-gdb
脚本,--start
或--launch
操作现在会等待 GNU 调试服务器,以便其更可靠地遇到执行路径中早先设置的断点(例如 JNI 代码中的断点)。(问题 41278)注意:此功能需要 jdb,并且会生成有关待处理断点的警告。指定
--nowait
选项即可恢复之前的行为。 - 修复了库列表为空时 GDB 会崩溃的问题。
- 修复了使用
stepi
命令越过bx pc
或blx pc
Thumb 指令时 GDB 会崩溃的问题。(问题 56962、问题 36149) - 修复了 MIPS
gdbserver
以查找DT_MIPS_RLD_MAP
,而非DT_DEBUG
。(问题 56586) - 修复了 ndk-build 脚本中的循环依赖项,例如:如果 A->B 并且 B->B,则不构建 B。(问题 56690)
- 修复了
- 其他的 bug 修复:
-
- 修复了
ndk-build
脚本,让您能够以命令行选项的形式(例如NDK_TOOLCHAIN_VERSION=clang3.2
)指定 Clang 版本。之前,只能以环境变量形式指定版本。 - 针对 MIPS 构建目标,将使用 Clang 编译器时的
_Unwind_Exception
gabi++ 大小修复成了 24。(变更 54141) - 修复了
ndk-build
脚本,以确保使用ndk-build clean
命令时,从包含预构建静态库的项目中实际移除已构建的库。 (变更 54461、变更 54480) - 修改了
NDK_ANALYZE=1
选项,以使其更简洁。 - 修复了
gnu-libstdc++/Android.mk
,以针对向后兼容的 build 添加backward/
路径。(问题 53404) - 修复了
stlport new
有时会返回随机值的问题。 - 修复了
ndk-gdb
,以便与CPU_ABIS
(而非APP_ABIS
)的顺序匹配。(问题 54033) - 修复了 MacOSX 上的 NDK 64 位 build 选择错误编译器路径的问题。(问题 53769)
- 修复了构建脚本,以检测 64 位 Windows Vista。(问题 54485)
- 修复了 x86
ntonl/swap32
错误:invalid 'asm': operand number out of range
。(问题 54465,变更 57242) - 修复了
ld.gold
以合并字符串字面量。 - 修复了
ld.gold
以处理大型符号对齐。 - 更新了
ld.gold
以启用--sort-section=name
选项。 - 修复了 GCC 4.4.3/4.6/4.7,以便针对静态链接的程序抑制
-export-dynamic
选项。对于静态链接的程序,GCC 不再添加.interp
部分。 - 修复了与
_Unwind_Control_Block
的typedef
不一致相关的 GCC 4.4.3stlport
编译错误。(问题 54426) - 修复了
awk
脚本,以便处理在 Windows 上创建的AndroidManifest.xml
文件,这些文件的尾部可能包含\r
字符,并且会导致构建错误。(问题 42548) - 修复了
make-standalone-toolchain.sh
以探测prebuilts/
目录,从而检测主机是 32 位还是 64 位。 - 修复了 Clang 3.2
-integrated-as
选项。 - 修复了 Clang 3.2 ARM EHABI 紧凑模型
pr1
和pr2
处理程序数据。 - 添加了 Clang
-mllvm -arm-enable-ehabi
选项,以修复以下 Clang 错误:clang: for the -arm-enable-ehabi option: may only occur zero or one times!
- 修复了应用清单中没有任何
uses-sdk
元素时发生的构建故障。(问题 57015)
- 修复了
- 其他变更:
-
- 头文件修复
- 由于
errno.h
中的__set_errno
已废弃,并且libc.so
不再将其导出,因此修改了头文件以使__set_errno
成为内联函数。 - 修改了
elf.h
以包含stdint.h
。(问题 55443) - 修复了
sys/un.h
,以便独立于其他头文件而单独将其包含在内。(问题 53646) - 修复了所有的
MotionEvent_getHistorical
API 系列,以便获取const AInputEvent* motion_event
。(问题 55873) - 修复了
malloc_usable_size
,以便获取const void*
。(问题 55725) - 修复了 stdint.h 以使其更兼容 C99。(变更 46821)
- 将
wchar.h
修改为了不重新定义WCHAR_MAX
和WCHAR_MIN
。 - 修复了与指针相关的
PRI
和SCN
宏的<inttypes.h>
声明。(问题 57218) - 更改了
sys/cdefs.h
头文件,以便对于级别 9 以下的 API 级别,__WCHAR_TYPE__
为 32 位,这意味着对于所有 API 级别,wchat_t
均为 32 位。要恢复之前的行为,请定义_WCHAR_IS_8BIT
布尔值变量。(问题 57267)
- 由于
- 在 NDK
docs/
中添加了更多格式,并修复了其他文档问题。 - 添加了构建静态库时对瘦归档技术的支持。 (问题 40303)
- 更新了
make-standalone-toolchain.sh
脚本,以使其在您指定--stl=stlport
选项时不仅支持stlport
,还支持gnustl
。如需了解详情,请参阅STANDALONE-TOOLCHAIN.html
。 - 更新了
make-standalone-toolchain.sh
脚本,以使--llvm-version=
选项除了创建$TOOLCHAIN_PREFIX-clang
和$TOOLCHAIN_PREFIX-clang++
脚本之外,还创建clang
和clang++
,从而避免意外使用主机的 clang 和 clang++ 定义。 - 添加了两个标志,以重新启用两项存在于上游 Clang 中但在 NDK 中停用的优化,以便更好地兼容 GCC 所编译的代码:
- 添加了
-fcxx-missing-return-semantics
标记,以重新启用 Clang 3.2+ 中缺失的返回语义。通常,所有路径在终止时都应提供针对值返回函数的返回语句。如果情况并非如此,则 Clang 会在没有返回语句的路径中插入一条未定义的指令(或进入调试模式)。如果您确定代码正确无误,请使用此标记以让优化器能够利用未定义的行为。如果您不确定,请勿使用此标记。调用方可能仍会收到不正确的随机值,但是优化器不会利用此值并导致代码更难以调试。 - 添加了
-fglobal-ctor-const-promotion
标记,以重新启用将具有静态构造函数的全局变量提升为常量的行为。利用此标记,LLVM 的全局变量优化环节会尝试对具有静态构造函数的全局变量进行求值,并将其提升为全局常量。虽然此优化并无问题,但可能会导致与 GCC 所编译的代码之间出现一定程度的不兼容。例如,代码可能会执行const_cast
以将常量转为可变的量,并进行修改。在 GCC 中,此变量可读可写,而代码会意外运行。在 Clang 中,常量变量位于只读内存中,并且可能会导致应用崩溃。
- 添加了
- 向 MIPS GCC 和 Clang 编译器添加了
-mldc1-sdc1
。默认情况下,编译器会正确对齐 8 字节对象,并发出ldc1
和sdc1
指令来移动它们。如果应用使用自定义分配器,而此分配器并不像默认分配器一样始终对齐新对象的 8 字节边界,那么应用可能会因针对未对齐内存执行ldc1
和sdc1
操作而崩溃。在这种情况下,请使用-mno-ldc1-sdc1
标志解决问题。 - 当
APP_PLATFORM_LEVEL
大于APP_MIN_PLATFORM_LEVEL
时,事件严重性会从警告降级为信息。由于 NDK 只有部分级别的头文件,因此APP_PLATFORM_LEVEL
可能会小于jni/Application.mk
中的APP_PLATFORM
。在这种情况下,实际级别会降低。APP_MIN_PLATFORM_LEVEL
由应用清单中的android:minSdkVersion
指定。(问题 39752) - 向
cpu-features.c
添加了android_getCpuIdArm()
和android_setCpuArm()
方法。添加之后有助于简化 ARM CPUID 信息检索过程。(问题 53689) - 修改了
ndk-build
,以将 GCC 4.7 的as/ld
用于 Clang 编译。注意:在 GCC 4.7 中,
monotonic_clock
和is_monotonic
已分别重命名为steady_clock
和is_steady
。 - 向
ndk-build
脚本添加了下列新警告:- 添加了在静态库模块中使用
LOCAL_LDLIBS/LDFLAGS
时发出的警告。 - 添加了配置没有可编译的模块时发出的警告。
- 添加了在共享库或可执行模块的
LOCAL_LDLIBS/LDFLAGS
中使用非系统库时发出的警告。
- 添加了在静态库模块中使用
- 更新了构建脚本,以便在未定义
APP_MODULES
且Android.mk
中仅列出静态库时,脚本能够强制构建所有库。(问题 53502) - 更新了
ndk-build
,以支持LOCAL_SRC_FILES
中的绝对路径。 - 移除了
*-gdbtui
可执行文件,它们与*-gdb
可执行文件重复,并且启用了-tui
选项。 - 更新了 build 脚本,以在 Edison Design Group (EDG) 编译器前端重新开启
_STLP_HAS_INCLUDE_NEXT
时发出警告。(问题 53646) - 添加了环境变量
NDK_LIBS_OUT
,以允许替换默认$PROJECT/libs
的libraries/gdbserver
路径。如需了解详情,请参阅OVERVIEW.html
。 - 更改了 ndk-build 脚本默认值,以在保护格式字符串 (
-Wformat -Werror=format-security
) 的情况下编译代码。您可设置LOCAL_DISABLE_FORMAT_STRING_CHECKS=true
以将其停用。如需了解详情,请参阅ANDROID-MK.html
。 - 在
ndk-gdb-py
中添加了 STL 美观输出支持。如需了解详情,请参阅NDK-GDB.html
。 - 添加了基于 googletest 框架的测试。
- 向工具链构建脚本添加了一项通知,以在当前 shell 并非
bash
时发出警告。
- 头文件修复
Android NDK r8e(2013 年 3 月)
- 重要变更:
-
- 添加了 64 位主机工具链集(软件包名称后缀为
*-x86_64.*
)。如需了解详情,请参阅CHANGES.HTML
和NDK-BUILD.html
。 - 添加了 Clang 3.2 编译器。GCC 4.6 仍为默认编译器。如需了解如何使用 Clang 编译器,请参阅
CHANGES.HTML
。 - 添加了适用于 Linux/MacOSX 主机的静态代码分析器。如需了解如何使用该分析器,请参阅
CHANGES.HTML
。 - 添加了适用于 Linux/MacOSX 主机的 MCLinker 作为实验性功能。
ld.gold
链接器在可用时即为默认链接器,因此您必须明确启用 MCLinker。如需了解详情,请参阅CHANGES.HTML
。 - 更新了 ndk-build,以对模块依赖项进行拓扑排序,这意味着 build 会自动对
LOCAL_STATIC_LIBRARIES
、LOCAL_WHOLE_STATIC_LIBRARIES
和LOCAL_SHARED_LIBRARIES
中指定的库进行排序。如需了解详情,请参阅CHANGES.HTML
。(问题 39378)
- 添加了 64 位主机工具链集(软件包名称后缀为
- 重要的 bug 修复:
-
- 修复了 build 脚本,以构建
-O2
中的所有工具链。之前版本中的工具链无法正确构建,而且不会进行优化。 - 修复了无条件为 64 位 MacOSX 构建 Clang/llvm 的构建脚本。
- 修复了 GCC 4.6/4.7 内部编译器错误:
gen_thumb_movhi_clobber at config/arm/arm.md:5832
。(问题 52732) - 修复了 GCC/ARM 4.6/4.7 无法使用 64 位原子内置函数链接代码的构建问题。(问题 41297)
- 修复了 GCC 4.7 链接器 DIV 用法不匹配错误。(Sourceware 问题)
- 修复了 GCC 4.7 内部编译器错误
build_data_member_initialization, at cp/semantics.c:5790
。 - 修复了 GCC 4.7 内部编译器错误
redirect_eh_edge_1, at tree-eh.c:2214
。(问题 52909) - 修复了 GCC 4.7 分段错误。(GCC 问题)
- 修复了
<chrono>
时钟分辨率并启用了steady_clock
。(问题 39680) - 修复了工具链,以便针对 GCC 4.7 libstdc++ 启用
_GLIBCXX_HAS_GTHREADS
。(问题 41770、问题 41859) - 修复了因缺失
posix_memalign
而无法链接 X86 MXX/SSE 代码的问题。(变更 51872) - 修复了
i386.c
中函数distance_non_agu_define_in_bb()
的 GCC4.7/X86 分段错误。(变更 50383) - 修复了 GCC4.7/X86 以恢复之前的
cmov
行为。(GCC 问题) - 修复了对 libstdc++/GCC4.7 中
setlocale()
NULL 返回值的处理。(问题 46718) - 修复了
ld.gold
对__exidx_start
和__exidx_start_end
进行运行时未定义引用的问题。(变更 52134) - 修复了使用 Eigen 库时发生的 Clang 3.1 内部编译器错误。(问题 41246)
- 修复了在 C++11 模式下添加
<chrono>
的 Clang 3.1 内部编译器错误。(问题 39600) - 修复了为统一初始化
rvalue
的方法调用生成对象代码时发生的 Clang 3.1 内部编译器错误。(问题 41387) - 修复了 Clang 3.1/X86 堆栈重新对齐。(变更 52154)
- 修复了在 Android 4.1.2 上调试时 GNU Debugger (GDB) SIGILL 的问题。(问题 40941)
- 修复了符号包含较长的间接文件路径时 GDB 无法设置
source:line
断点的问题。(问题 42448) - 修复了适用于 MIPS PIE 可执行文件的 GDB
read_program_header
。(变更 49592) - 修复了
uncaught_exception()
中的STLport
分段错误。(变更 50236) - 修复了因对
DW_EH_PE_udata2
、DW_EH_PE_udata4
和DW_EH_PE_udata8
进行非对齐访问而引起的异常处理中的STLport
总线错误。 - 修复了
nothrow new[]
运算符的 Gabi++ 无限递归问题。(问题 52833) - 修复了 Gabi++ 对异常处理程序指针的错误偏移问题。(变更 53446)
- 移除了 Gabi++ 对异常对象的冗余释放(变更 53447)
- 修复了 build 脚本,以构建
- 其他的 bug 修复:
-
- 修复了 NDK 头文件:
- 修复了
STLport
,以便在发生内存不足错误后取消,而非静默退出。 - 修复了系统和 Gabi++ 头文件,以便能够使用 API 级别 8 及更低级别进行编译。
- 修复了
cpufeatures
,使其不解析/proc/self/auxv
。(问题 43055) - 修复了
ld.gold
,使其不依赖于主机 libstdc++ 和 Windows 平台,也不依赖于libgcc_sjlj_1.dll
库。 - 修复了在
.vsave
中发出不一致的寄存器列表并导致编译器故障的 Clang 3.1 问题。(变更 49930) - 修复了 Clang 3.1,以便能够编译 libgabi++,以及通过针对 MIPS 构建目标的
test-stlport
测试。(变更 51961) - 修复了 Clang 3.1,以便仅针对 C++ 默认启用异常,而不针对 C 启用。
- 修复了 Clang 3.1 中的多个问题,确保能够通过大部分 GNU 异常测试。
- 修复了独立 NDK 编译器中的
clang
和clang++
脚本,以便检测-cc1
,并在找到后不予指定-target
。 - 修复了
ndk-build
,以便遵循Application.mk
中设置的NDK_APP_OUT
。 - 修复了 X86
libc.so
和lib.a
,之前二者缺失已在setjmp.h
中声明的sigsetjmp
和siglongjmp
函数。(问题 19851) - 发布了 GCC 4.4.3/4.6/4.7 libstdc++ 的补丁程序,以便在 C++ 11 中与 Clang 配合使用。(Clang 问题)
- 修复了传递到
HOST_AWK
的参数中的 cygwin 路径。 - 修复了从项目 JNI 目录运行时窗口中发出的
ndk-build
脚本警告。(问题 40192) - 修复了当 makefile 的
LOCAL_PATH
定义在尾部包含空格时,ndk-build
脚本无法构建的问题。(问题 42841)
- 其他变更:
-
- 在 GCC/MIPS 工具链中启用了线程支持。
- 更新了 GCC 异常处理辅助程序
__cxa_begin_cleanup
和__cxa_type_match
,使其在 GNU libstdc++ 中具有默认可见性,而非以往的隐式可见性。如需了解详情,请参阅CHANGES.HTML
。 - 更新了编译脚本,现在会以隐式可见性编译 Gabi++ 和 STLport 静态库,但异常处理辅助程序除外。
- 更新了 build,以便在 Thumb 模式下为 ARM 构建
STLport
。 - 在 Gabi++ 中添加了对
std::set_new_handler
的支持。(问题 52805) - 在 GNU libstdc++ 中启用了
FUTEX
系统调用。 - 更新了
ndk-build
,使其不再将预构建静态库复制到项目的obj/local/<abi>/
目录中。 (问题 40302) - 从 ARM
toolchains/*/setup.mk
脚本中移除了__ARM_ARCH_5*__
。(问题 21132) - 在 Thumb 模式下为 ARM 编译了额外的 GNU libstdc++ 库。
- 针对 32 位 FPU 启用了 MIPS 浮点
madd/msub/nmadd/nmsub/recip/rsqrt
指令。 - 在 GCC 4.6 和 4.7 中启用了 graphite 循环优化器,以启用更多优化:
-fgraphite
、-fgraphite-identity
、-floop-block
、-floop-flatten
、-floop-interchange
、-floop-strip-mine
、-floop-parallelize-all
和-ftree-loop-linear
。(信息) - 对 Linux 和 Max OS X 32 位主机上的 Clang 3.1 启用了
polly
,以便分析和优化内存访问。(信息) - 在 Linux 上的 GCC 4.7、GCC 4.6、Clang 3.2 和 Clang 3.1 中启用了
-flto
(通过 LLVMgold.so 实现 Clang LTO)。由于ld.gold
不可用,因此不支持 MIPS 编译器目标。 - 在 GCC 4.6/4.7 中对
ld.gold
启用了--plugin
和--plugin-opt
。 - 在 GCC 4.7 中对
ld.gold
启用了--text-reorder
。 - 对 GNU libstdc++ 配置了
_GLIBCXX_USE_C99_MATH
,以取消定义 Bionic 头文件中的isinf
脚本。如需了解详情,请参阅CHANGES.html
。 - 向编译脚本添加了
APP_LDFLAGS
。如需了解详情,请参阅ANDROID-MK.html
。 - 将构建脚本更新为允许
NDK_LOG=0
以停用NDK_LOG
。 - 将编译脚本更新为了允许
NDK_HOST_32BIT=0
以停用主机开发者环境 32 位工具链。 - 将默认的 GCC/X86 标志
-march=
和-mtune=
从pentiumpro
和generic
更改为i686
和atom
。 - 增强了工具链编译脚本:
- 修复了
build-gcc.sh
中针对mingw
build 类型的竞态条件;以前,此类型会导致无法处理大量的并行构建。 - 更新了
build-gabi++.sh
和build-stlport.sh
,它们现在可以从 NDK 软件包中运行。(问题 52835) - 修复了
MSys
实用程序集合中的run-tests.sh
。 - 改进了 64 位主机工具链和 Canadian Cross 构建支持。
- 将
build-mingw64-toolchain.sh
脚本更新为最近的版本。 - 添加了在不具有隐式可见性的情况下构建
libgnustl_static.a
和stlport_static.a
的选项。
- 修复了
Android NDK r8d(2012 年 12 月)
- 重要变更:
-
- 向 NDK 中添加了 GNU Compiler Collection (GCC) 4.7 编译器。GCC 4.6 编译器仍为默认编译器,因此您必须明确启用新版本,具体步骤如下所示:
- 对于
ndk-build
,请导出NDK_TOOLCHAIN_VERSION=4.7
变量或将其添加到Application.mk
。 - 对于独立 build,请将
--toolchain=
选项添加到make-standalone-toolchain.sh
,例如:--toolchain=arm-linux-androideabi-4.7
注意:此功能处于实验阶段。请试用此功能并报告任何问题。
- 对于
- 通过 gabi++ 添加了
stlport
异常支持。请注意,新的 gabi++ 依赖于dlopen
和相关代码,这意味着:- 您无法再使用
-static
选项编译静态可执行文件,也无法再使用APP_STL := stlport_static
包含libstlport_static.a
。(您仍可将-static
选项与独立工具链配合使用。)但仍可使用include $(BUILD_EXECUTABLE)
编译动态可执行文件,因为编译器会自动添加-ldl
选项。 - 如果项目使用
-nostdlib
和 {-Wl,--no-undefined} 进行链接,则您必须手动包含-ldl
选项。
CPLUSPLUS-SUPPORT.html
。注意:此功能处于试验阶段,更适合与 GCC 4.6/4.7 编译器(而非 GCC 4.4.3 或 Clang 3.1)配合使用。请试用此功能并报告任何问题。
- 您无法再使用
- 添加了适用于 x86 的
-mstack-protector-guard=
选项,以便选择与旧版 Android C 库 (Bionic) 兼容的全局默认路径,或选择使用 GCC 4.6 及更高版本编译器且适用于-fstack-protector
、-fstack-protector-all
和-fstack-protector-strong
的新 tls 路径 (%gs:20)。注意:
-mstack-protector-guard
设置本身不会启用任何-fstack-protector*
选项。 - 向
sources/android/cpufeatures/cpu-features.c
添加了android_setCpu()
函数,以便在 Android 4.1 及更高版本中无法通过/proc
进行自动检测时使用。(Chromium 问题 164154)
- 向 NDK 中添加了 GNU Compiler Collection (GCC) 4.7 编译器。GCC 4.6 编译器仍为默认编译器,因此您必须明确启用新版本,具体步骤如下所示:
- 重要的 bug 修复:
-
- 修复了使用
ndk-build
脚本时非必要地重新构建对象文件的问题。 (问题 39810) - 修复了 Mac OS X 10.6.x 的 NDK 8c 版本的链接器故障,此故障会生成以下错误:
此问题是由在 Mac OS X 10.7 上进行构建所引起,而这会生成 与 Mac OS 10.6.x 和 NDK 不兼容。dyld: lazy symbol binding failed: Symbol not found: _memmem Referenced from: ...../arm-linux-androideabi/bin/ld Expected in: /usr/lib/libSystem.B.dylib
- 从 Clang++ 独立构建脚本中移除了
-x c++
选项。(问题 39089) - 修复了在 Cygwin 中使用
NDK_TOOLCHAIN_VERSION=clang3.1
选项的问题。(问题 39585) - 修复了
make-standalone-toolchain.sh
脚本,以允许使用 Cygwin 或 MinGW 环境生成独立工具链。生成的工具链可以在 Cygwin、MingGW 或 CMD.exe 环境中使用。(问题 39915、问题 39585) - 在针对 ARM 和 X86 的 android-14 build 中添加了缺失的
SL_IID_ANDROIDBUFFERQUEUESOURCE
选项。(问题 40625) - 修复了针对
ANDROID_CPU_X86_FEATURE_MOVBE
功能的 x86 CPU 检测。(问题 39317) - 修复了阻止标准模板库 (STL) 使用无
.cpp
文件扩展名的 C++ 源文件的问题。 - 修复了在 reload1.c:1061 处发生的 GCC 4.6 ARM 内部编译器错误。(问题 20862)
- 修复了在 emit-rtl.c:1954 处发生的 GCC 4.4.3 ARM 内部编译器错误。(问题 22336)
- 修复了在 postreload.c:396 处发生的 GCC 4.4.3 ARM 内部编译器错误。(问题 22345)
- 修复了 GCC 4.6/4.7 跳过 lambda 函数的问题。(问题 35933)
- 修复了使用
- 其他的 bug 修复:
-
- NDK 头文件修复:
- 将
__WINT_TYPE__
和wint_t
修复为了同一类型。 - 更正了
android/bitmap.h
中的拼写错误。(问题 15134) - 更正了
errno.h
中的拼写错误。 - 添加了检查
sys/cdefs.h
中是否存在__STDC_VERSION__
的功能。(问题 14627) - 重新组织了
byteswap.h
和dirent.h
中的头文件。 - 修复了
limits.h
以包含page.h
,后者可提供PAGE_SIZE
设置。(问题 39983) - 将
glGetAttribLocation()
和glGetUniformLocation()
的返回类型从int
修复为了GLint
。 - 修复了 x86 build 的
__BYTE_ORDER
常量。 (问题 39824)
- 将
- 修复了
ndk-build
脚本,以便执行 ARM 构建时不以-O2
覆盖-Os
。 - 修复了编译脚本,以允许覆盖
HOST_AWK
、HOST_SED
和HOST_MAKE
设置。 - 修复了链接 Intel C/C++ 编译器 (ICC) 所编译的对象的
fsck_msdos
编译系统上的ld.gold
问题。 - 修复了 Clang 中的 ARM EHABI 支持,以符合规范。
- 修复了 GNU Debugger (GDB),以缩短在
solib
事件期间遍历目标链接映射所花费的时间。 (问题 38402) - 修复了链接共享库时缺失
libgcc.a
文件的问题。
- NDK 头文件修复:
- 其他变更:
-
- 已将 ARM 的 64 位内置原子函数向后移植至 GCC 4.6。
- 添加了有关音频输出延迟的文档,以及其他文档和修复。
- 修复了使用 Clang 的调试编译系统,现在非空函数会针对不含返回语句的路径发出
SIGILL
信号。 - 将
make-standalone-toolchain.sh
更新为了接受后缀-clang3.1
,这相当于将--llvm-version=3.1
添加到 GCC 4.6 工具链。 - 将 GCC 和 Clang bug 报告网址更新为:https://source.android.com/source/report-bugs.html
- 向
llvm-objdump
添加了 ARM ELF 支持。 - 已针对 Clang 编译系统,抑制将 c 输入处理为 c++ 警告。
- 更新了 build,以便仅构建 32 位版本的
libiberty.a
并将其放入lib32/
。
Android NDK r8c(2012 年 11 月)
- 重要变更:
-
- 向 NDK 添加了 Clang 3.1 编译器。GNU Compiler Collection (GCC) 4.6 仍为默认编译器,因此您必须明确启用 Clang 编译器选项,具体步骤如下所示:
- 对于
ndk-build
,请导出NDK_TOOLCHAIN_VERSION=clang3.1
,或将此环境变量设置添加到Application.mk
中。 - 对于独立 build,请将
--llvm-version=3.1
添加到make-standalone-toolchain.sh
,并将 makefile 中的CC
和CXX
替换为<tool-path>/bin/clang
和<tool-path>/bin/clang++
。如需了解详情,请参阅STANDALONE-TOOLCHAIN.html
。
注意:此功能处于实验阶段。请试用此功能并报告任何问题。
- 对于
- 添加了适用于 Windows 工具链的 Gold 链接器
ld.gold
。Gold 链接器也是所有主机上 ARM 和 X86 的默认链接器。您可以向Android.mk
添加LOCAL_LDFLAGS += -fuse-ld=bfd
,或将-fuse-ld=bfd
传递至执行链接的 g++/clang++ 命令行,从而改用ld.bfd
链接器。 - 添加了检查
ndk-build[.cmd]
和ndk-gdb
脚本的 NDK 路径中是否包含空格的功能,以防止出现难以诊断的编译错误。 - 对 API 级别处理进行了以下变更:
- 修改了构建逻辑,以便在
APP_PLATFORM
、project.properties
或default.properties
中指定android-10
到android-13
的项目链接到android-9
,而非android-14
。 - 更新了相关 build,以便使用 android-16 (Jelly Bean) 或更高版本的可执行文件通过
-fPIE
选项进行编译,从而生成位置独立的可执行文件 (PIE)。借助新的APP_PIE
选项,您可以控制此行为。如需了解详情,请参阅APPLICATION-MK.html
。注意:所有高于 API 级别 14 的级别仍会链接到
platforms/android-14
,并且未添加新的platforms/android-N
。 - 修改了
ndk-build
,以便在调整后的 API 级别高于项目AndroidManifest.xml
中的android:minSdkVersion
时发出警告。
- 修改了构建逻辑,以便在
- 更新了
cpu-features
辅助程序库,以包含更多特定于 ARM 的功能。如需了解详情,请参阅sources/android/cpufeatures/cpu-features.h
。 - 将 X86 平台上的长双精度修改为了 8 个字节。此数据类型的大小现在与双精度相同,但仍被视为不同的类型。
- 更新了
APP_ABI=armeabi-v7a
的编译系统:- 修改了此编译类型,以便将
-march=armv7-a
参数传递给链接器。此更改可确保正确链接特定于 v7 的库和crt*.o
。 - 向
ndk-build
添加了-mfpu=vfpv3-d16
,从而替代之前版本中使用的-mfpu=vfp
选项。
- 修改了此编译类型,以便将
- 向 NDK 添加了 Clang 3.1 编译器。GNU Compiler Collection (GCC) 4.6 仍为默认编译器,因此您必须明确启用 Clang 编译器选项,具体步骤如下所示:
- 重要的 bug 修复:
-
- 修复了以 root 权限运行
make-standalone-toolchain.sh
会导致独立工具链不可供某些用户访问的问题。(问题 35279)- NDK 发布软件包中的所有文件和可执行文件都设置为向所有用户提供读取和执行权限。
libstdc++.a
的所有权/所属组现在会在复制时保留。
- 从 Windows 预构建
echo.exe
中移除了冗余\r
。冗余\r
导致了gdb.setup
在 GNU Debugger (GDB) 中失败,因为它会错误地成为路径的一部分。(问题 36054) - 修复了有时会因
host-mkdir
实现中的计时问题而失败的 Windows 并行构建问题。 (问题 25875) - 将 GCC 4.4.3 GNU
libstdc++
修复为在默认情况下不合并typeinfo
名称。如需了解详情,请参阅toolchain repo gcc/gcc-4.4.3/libstdc++-v3/libsupc++/typeinfo
。(问题 22165) - 修复了 GCC 4.6
cp/mangle.c::write_unscoped_name
中null
上下文的问题,即当上下文为null
并在TREE_CODE
中解除引用时,GCC 可能会崩溃。 - 修复了处理特定于 ARM NEON 的浮点型定义时 GCC 4.4.3 崩溃的问题。(问题 34613)
- 修复了
STLport
内部_IteWrapper::operator*()
实现问题,其中会返回存储已解除引用的值的旧堆栈位置,并导致运行时崩溃。(问题 38630) - 特定于 ARM 的修复:
- 修复了 ARM GCC 4.4.3/4.6
g++
,现在不会发出“<va_list> 的破坏处理在 GCC 4.4 中已更改”警告。不再需要采用通过-Wno-psabi
开关避免此警告的解决方法。 - 修复了在
LOCAL_SRC_FILES
中指定.arm
或.neon
后缀的项目也使用APP_STL
的问题。使用APP_STL
时,ndk-build
脚本会先在LOCAL_SRC_FILES
中搜索 C++ 文件,然后再添加要编译的 STLheader/lib
路径。将ndk-build
修改为了先过滤掉.arm
和.neon
后缀再执行搜索,否则LOCAL_SRC_FILES
中的项(例如myfile.cpp.arm.neon
)不会编译为 C++ 代码。 - 修复了
binutils-2.21/ld.bfd
,使其能够链接来自旧 binutils 的对象而无需tag_FP_arch
,之前此链接会在 GNU Binutils 中生成“断言失败”错误消息。(问题 35209) - 移除了当
binutils-2.19/ld
通过更新的binutils-2.21
链接预构建对象时发出的“EABI 对象属性 44 未知”警告。 - 通过修改
make-standalone-toolchain.sh
以填充子目录armv7-a/thumb
中的headers/libs
,修复了同时使用-mthumb
和-march=armv7-a
时发生的 GNUstdc++
编译问题。(问题 35616) - 修复了“无法解析 R_ARM_THM_CALL 重定位”错误。(问题 35342)
- 修复了在
reload1.c:3633
处发生的内部编译器错误,发生此错误是因为从char
进行符号扩展时,ARM 后端期望的操作数类型错误。(GCC 问题 50099) - 修复了移位量为负数时发生的内部编译器错误。(GCC 问题)
- 修复了 ARM GCC 4.4.3/4.6
- 修复了 X86 的
-fstack-protector
,这也是ndk-build
x86 ABI 目标的默认设置。 - 特定于 MIPS 的修复:
- 通过在编译 MIPS
libstlport_*
时将_STLP_LITTLE_ENDIAN
设置为 1,修复了STLport
字节顺序。 - 修复了编译 LLVM 时会遇到的 GCC
__builtin_unreachable
问题。(GCC 问题 54369) - 向后移植了针对
cc1
编译进程会耗用 100% CPU 的修复。(GCC 问题 50380)
- 通过在编译 MIPS
- 特定于 GNU Debugger 的修复:
- 在构建时停用了 gdb-7.x 中的 Python 支持,否则 gdb-7.x 配置功能可能会选用主机上可用的任何 Python 版本,并以硬性依赖于特定 Python 版本的方式构建
gdb
。(问题 36120) - 修复了当
APP_ABI
包含all
并且不与任何已知架构匹配时的ndk-gdb
问题。(问题 35392) - 修复了 Windows 路径名支持,方法是如果
:
字符看起来像是以驱动器盘符开头的 Windows 路径的一部分,则予以保留。(GDB 问题 12843) - 修复了在
gdbserver
中针对 ARM 添加硬件断点支持的问题。(GDB 问题) - 添加了在链接器一致时仅读取当前
solibs
的修复功能。此更改可以加快solib
事件处理速度。(问题 37677) - 添加了反复尝试查找
solib
断点的修复功能。现在,GDB 在每次调用svr4_current_sos()
时都会重试enable_break()
,直至成功为止。(变更 43563) - 修复了
gdb
不会在dlopen-ed
库中设置的断点处停止的问题。(问题 34856) - 修复了动态链接器中的
SIGILL
,在/system/bin/linker
中的符号已剥离,并已实现rtld_db_dlactivity()
作为Thumb
的系统上调用dlopen()
时,现在不会因为未保留sym_addr
的LSB
而引起问题。(问题 37147)
- 在构建时停用了 gdb-7.x 中的 Python 支持,否则 gdb-7.x 配置功能可能会选用主机上可用的任何 Python 版本,并以硬性依赖于特定 Python 版本的方式构建
- 修复了以 root 权限运行
- 其他的 bug 修复:
-
- 修复了 NDK 头文件:
- 修复了之前从原始内核中错误移除的
arch-mips/include/asm/*
代码。(变更 43335) - 将
linux/sysctl.h
和linux/icmp.h
中的结构成员数据__unused
替换为__linux_unused
,以避免与sys/cdefs.h
中的#define __unused
发生冲突。 - 修复了
fenv.h
中封装在__BEGIN_DECLS
和__END_DECLS
内的 C 函数。 - 从
malloc.h
中移除了未实现的函数。 - 针对 ANSI 编译器修复了
uint64_t
的stdint.h
定义。(问题 1952) - 修复了
<arch>/include/machine/*
中的预处理器宏。 - 将 MIPS 的
link.h
替换为了支持所有平台的新版本。 - 移除了
linux-unistd.h
。 - 将特定于 GLibc 的宏
LONG_LONG_MIN
、LONG_LONG_MAX
和ULONG_LONG_MAX
从<pthread.h>
移至<limits.h>
。
- 修复了之前从原始内核中错误移除的
- 修复了
ndk-stack-parser
中的缓冲区溢出问题。 - 修复了
_STLP_USE_EXCEPTIONS
,从而在未定义时使其省略__Named_exception
的所有声明以及对其的使用。仅当允许STLport
使用异常时,才会编译并使用__Named_exception
设置。 - 修复了仅适用于 Linux 的 NDK 软件包的编译,不会同时编译 Windows 代码。请使用下列设置执行此类编译:
./build/tools/make-release.sh --force --systems=linux-x86
- 修复了
libc.so
,使其不会导出atexit()
和__do_handler
。C 库的系统版本针对 ARM 编译系统导出了这些符号,以支持旧版原生库。NDK 生成的机器代码不应直接引用这些符号。每个共享库或可执行文件都应嵌入自己的符号版本(由crtbegin_*.o
提供)。如果您的项目使用
-nostdlib -Wl,--no-undefined
选项进行链接,您必须提供自己的__dso_handle
,因为在这种情况下不会链接crtbegin_so.o
。__dso_handle
的内容并不重要,如以下代码示例所示:extern "C" { extern void *__dso_handle __attribute__((__visibility__ ("hidden"))); void *__dso_handle; }
- 修复了在
objdump
中用于plt
条目的 ARM 符号解码器,以便生成更容易阅读的function@plt
。 - 从 X86 平台
libc.so
库中移除了 GCC 4.6libgcc.a
中引入的下列符号:__aeabi_idiv0
、__aeabi_ldiv0
、__aeabi_unwind_cpp_pr1
和__aeabi_unwind_cpp_pr2
。 - 从 MIPS
crt*_so.S
中移除了未使用的.ctors
、.dtors
和.eh_frame
。 - 更新了
ndk-gdb
,使其仅使用ndk-build
DUMP_XXXX
输出中的最后一行。此更改可确保Application.mk
或Android.mk
采用$(info ...)
语法输出内容时,相应内容不会注入到DUMP_XXXX
的结果中。(了解详情)
- 修复了 NDK 头文件:
- 其他变更:
-
- 从
platforms/android-[3,4,5,8]
中移除了arch-x86
和arch-mips
头文件。这些头文件不完整,因为 X86 和 MIPS ABI 仅在 API 9 或更高版本中受支持。 - 简化了独立软件包中的 c++ include 路径,如下所示。(问题 35279)
<path>/arm-linux-androideabi/include/c++/4.6.x-google to: <path>/include/c++/4.6/
- 修复了
ndk-build
以便默认识别更多 C++ 文件扩展名:.cc .cp .cxx .cpp .CPP .c++ .C
。您仍可使用LOCAL_CPP_EXTENSION
覆盖这些扩展名设置。 - 修复了
samples/san-angeles
中导致重新启动时显示黑屏或冻结帧的问题。 - 替换了 NDK 示例中已废弃的 API。(问题 20017)
hello-gl2
:从 android-5 到 android-7native-activity
:从 android-9 到 android-10native-audio
:从 android-9 到 android-10native-plasma
:从 android-9 到 android-10
- 通过
.note.android.ident
部分(在crtbegin_static/dynamic.o
中定义)更简单的架构为 Android 可执行文件添加了新的品牌信息,以便调试工具相应地做出处理。结构成员和值的定义如下所示:static const struct { int32_t namesz; /* = 8, sizeof ("Android") */ int32_t descsz; /* = 1 * sizeof(int32_t) */ int32_t type; /* = 1, ABI_NOTETYPE */ char name[sizeof "Android"]; /* = "Android" */ int32_t android_api; /* = 3, 4, 5, 8, 9, 14 */ }
弃用了
.note.ABI-tag
部分之前的品牌选项。 - 添加了新脚本
run-tests-all.sh
,它会通过各种条件调用run-tests.sh
和standalone/run.sh
。脚本run-tests.sh
可以在不使用--abi
选项的情况下运行,并且已增强,可以针对所有受支持的 ABI 编译大部分测试,并在所有相连设备上运行。
- 从
Android NDK r8b(2012 年 7 月)
此版本的主要功能是新增的 GNU Compiler Collection (GCC) 4.6 工具链以及 GNU Debugger (GDB) 7.3.x,后者添加了对 Android 4.1(API 级别 16)系统映像的调试支持。
- 重要的 bug 修复:
-
- 修复了在 Mac OS 和 Windows Cygwin 环境中使用静态库时的
LOCAL_SHORT_COMMANDS
问题。列表文件的生成速度加快,并且不会重新生成此文件,以避免重复重新编译项目。 - 修复了
ndk-gdb
中的多个问题:- 更新了相应工具,以便更一致地将标记
-e
、-d
和-s
传递给 adb。 - 将工具更新为接受包含空格的设备序列名称。
- 将工具更新为了检索
/system/bin/link
信息,以使主机上的gdb
可以在__dl_rtld_db_dlactivity
中设置断点,并且了解链接器活动(例如,在调用dlopen()
时重新扫描solib
符号)。
- 更新了相应工具,以便更一致地将标记
- 修复了 Windows 上的
ndk-build clean
,之前其无法移除./libs/*/lib*.so
。 - 修复了
ndk-build.cmd
,使其在make
失败时返回非零ERRORLEVEL
。 - 修复了
libc.so
,以停止不正确地导出__exidx_start
和__exidx_end
符号。 - 修复了针对 ARM 和 MIPS 展开堆栈越过
__libc_init
时的SEGV
问题。
- 修复了在 Mac OS 和 Windows Cygwin 环境中使用静态库时的
- 重要变更:
-
- 添加了 GCC 4.6 工具链(具备
gold
的binutils
2.21 以及 GDB 7.3.x),以与原始的 GCC 4.4.3 工具链(binutils
2.19 和 GDB 6.6)共存。- GCC 4.6 现在是默认工具链。您可在
Application.mk
中设置NDK_TOOLCHAIN_VERSION=4.4.3
以选择原始工具链。 - 对
gold
链接器的支持仅适用于 Linux 和 Mac OS 主机上的 ARM 和 x86 架构。此支持默认处于停用状态。向Android.mk
添加LOCAL_LDLIBS += -fuse-ld=gold
即可将其启用。 - 使用
-fPIE
编译的程序需要新的GDB
来进行调试,包括 Android 4.1(API 级别 16)系统映像中的二进制文件。 binutils
2.21ld
工具包含从 2.22 版向后移植的修复:- 停用了
sincos()
优化,以便与旧平台兼容。
- GCC 4.6 现在是默认工具链。您可在
- 更新了构建选项,以便默认启用从不执行 (NX) 位和
relro
/bind_now
保护:- 向编译器添加了
--noexecstack
并向链接器添加了-z noexecstack
,以便对堆栈和堆启用 NX 位,从而提供预防缓冲区溢出攻击的 NX 保护。 - 向链接器添加了
-z relro
和-z now
,以便在链接后强化内部数据部分,预防因内存损坏而引起的安全漏洞。(了解详情:1、2) - 可使用下列选项停用这些功能:
- 通过为编译器设置
--execstack
选项以及为链接器设置-z execstack
选项,停用 NX 保护。 - 通过为链接器设置
-z norelro
和-z lazy
选项,停止强化内部数据。 - 通过设置下列选项,在 NDK
jni/Android.mk
中停用这些保护:LOCAL_DISABLE_NO_EXECUTE=true # disable "--noexecstack" and "-z noexecstack" DISABLE_RELRO=true # disable "-z relro" and "-z now"
如需了解详情,请参阅
docs/ANDROID-MK.html
。 - 通过为编译器设置
- 向编译器添加了
- 通过
.note.ABI-tag
部分(在crtbegin_static/dynamic.o
中)为 Android 可执行文件添加了品牌信息,以便调试工具相应地做出处理。结构成员和值的定义如下所示:static const struct { int32_t namesz; /* = 4, sizeof ("GNU") */ int32_t descsz; /* = 6 * sizeof(int32_t) */ int32_t type; /* = 1 */ char name[sizeof "GNU"]; /* = "GNU" */ int32_t os; /* = 0 */ int32_t major; /* = 2 */ int32_t minor; /* = 6 */ int32_t teeny; /* = 15 */ int32_t os_variant; /* = 1 */ int32_t android_api; /* = 3, 4, 5, 8, 9, 14 */ }
- 添加了 GCC 4.6 工具链(具备
- 其他的 bug 修复:
-
- 修复了
mips-linux-gnu
重定位截断为适合R_MIPS_TLS_LDM
的问题。(了解详情) - 修复了使用
--gc-sections
时ld
工具的分段错误。 (了解详情) - 修复了 MIPS
GOT_PAGE
计数问题。(了解详情) - 修复了
mips_elf_count_got_symbols
的跟进警告符号链接。 - 修复了
mips_elf_allocate_lazy_stub
的跟进警告符号链接。 - 将 MIPS
.dynamic
移动到了数据段,以使其可写入。 - 将符号的硬编码值替换为 MIPS 的正确段大小。
- 从 MIPS 工具链中的默认值中移除了
-mno-shared
选项。Android 工具链的默认值为-fPIC
,或者为-fpic
(如果受支持)。如果您未明确指定-mshared
、-fpic
、-fPIC
、-fpie
或-fPIE
,则 MIPS 编译器会添加-mno-shared
以关闭 PIC。修复了编译器,在这种情况下不会添加-mno-shared
。 - 修复了
hello-jni
和two-libs
示例中错误的软件包名称,以使其下的tests
项目可编译。
- 修复了
- 其他变更:
-
- 更改了二进制文件的位置:
- 将
gdbserver
从toolchain/<arch-os-ver>/prebuilt/gdbserver
移动到了prebuilt/android-<arch>/gdbserver/gdbserver
。 - 将 x86 工具链前缀从
i686-android-linux-
重命名为了i686-linux-android-
。 - 在使用 GCC 4.6 进行编译时将
sources/cxx-stl/gnu-libstdc++/include
和lib
移动到了sources/cxx-stl/gnu-libstdc++/4.6
,或在使用 GCC 4.4.3 进行编译时将其移动到了sources/cxx-stl/gnu-libstdc++/4.4.3
。 - 将
libbfd.a
和libintl.a
从lib/
移动到了lib32/
。
- 将
- 添加和改进了重新构建及测试 NDK 工具链中的各种脚本:
- 添加了
build-mingw64-toolchain.sh
,以生成由 Linux 托管的新工具链,用于生成 Win32 和 Win64 可执行文件。 - 通过使用
clone
命令,以及仅对编译 NDK 工具链二进制文件所需的目录使用checkout
,加快了download-toolchain-sources.sh
的速度。 - 添加了
build-host-gcc.sh
和build-host-gdb.sh
脚本。 - 添加了
tests/check-release.sh
,用于检查给定 NDK 安装目录的内容,或检查现有 NDK 软件包的内容。 - 重新编写了
tests/standalone/run.sh
独立测试。
- 添加了
- 从所有平台和架构中移除了
if_dl.h
头文件。它所描述的AF_LINK
和sockaddr_dl
元素专用于 BSD(即,在 Linux 中不存在)。
- 更改了二进制文件的位置:
Android NDK r8(2012 年 5 月)
此版本的 NDK 支持 MIPS ABI,还修复了几个其他问题。
- 新功能:
-
- 添加了对 MIPS ABI 的支持,以允许您生成可在基于 MIPS 的兼容 Android 设备上运行的机器代码。MIPS 的主要功能包括特定于 MIPS 的工具链、系统头文件、库和调试支持。如需详细了解 MIPS 支持,请参阅 NDK 软件包中的
docs/CPU-MIPS.html
。默认情况下,将会面向基于 ARM 的设备生成代码。您可以在
Application.mk
文件的APP_ABI
定义中添加mips
,以面向 MIPS 平台进行编译。例如,下面这行代码会指示ndk-build
针对 3 个不同的 ABI 编译代码:APP_ABI := armeabi armeabi-v7a mips
除非您依赖特定于架构的汇编源代码(例如 ARM 汇编代码),否则无需处理
Android.mk
文件即可编译 MIPS 机器代码。 - 在调用
make-standalone-toolchain.sh
时,您可以使用--arch=mips
选项编译独立的 MIPS 工具链。如需了解详情,请参阅docs/STANDALONE-TOOLCHAIN.html
。
注意:为确保仅在用户设备能够运行您的应用时向其提供应用,Google Play 会根据应用中包含的指令集信息过滤应用,而您自己无需执行任何操作即可启用过滤。此外,Android 系统本身也会在安装时检查您的应用,并且仅在此应用提供针对设备 CPU 架构编译的库时,才允许继续安装。
- 添加了对 MIPS ABI 的支持,以允许您生成可在基于 MIPS 的兼容 Android 设备上运行的机器代码。MIPS 的主要功能包括特定于 MIPS 的工具链、系统头文件、库和调试支持。如需详细了解 MIPS 支持,请参阅 NDK 软件包中的
- 重要的 bug 修复:
-
- 修复了 GAbi++ 实现中的拼写错误,如果对基类对象
b
执行dynamic_cast<D>(b)
以转换为派生类D
,则结果错误地朝向基类的反方向进行调整。(问题 28721) - 修复了
make-standalone-toolchain.sh
无法复制libsupc++.*
的问题。
- 修复了 GAbi++ 实现中的拼写错误,如果对基类对象
- 其他的 bug 修复:
-
- 修复了
ndk-build.cmd
以确保ndk-build.cmd
正常运行,即使用户已重新定义SHELL
环境变量也是如此(在 Windows 环境中安装各种开发工具都有可能改变此变量)。
- 修复了
Android NDK r7c(2012 年 4 月)
此版本的 NDK 包含对基于 Tegra2 的设备的重要修复,以及其他几项修复和改进:
- 重要的 bug 修复:
-
- 修复了 GNU STL armeabi-v7a 二进制文件,以避免非 NEON 设备上出现崩溃问题。NDK r7b 随附的文件未经正确配置,导致在基于 Tegra2 的设备及其他设备上尝试使用特定浮点函数(例如,
cosf
、sinf
和expf
)时发生崩溃。
- 修复了 GNU STL armeabi-v7a 二进制文件,以避免非 NEON 设备上出现崩溃问题。NDK r7b 随附的文件未经正确配置,导致在基于 Tegra2 的设备及其他设备上尝试使用特定浮点函数(例如,
- 重要变更:
-
- 通过
NDK_OUT
环境变量添加了对自定义输出目录的支持。经过定义后,此变量会用于存储所有已生成的中间文件,而不是$PROJECT_PATH/obj
。ndk-gdb
也会识别此变量。 - 现已支持编译具有数百甚至数千个源文件的模块,只需在
Android.mk
中将LOCAL_SHORT_COMMANDS
定义为true
即可。此更改会强制 NDK 编译系统将大部分链接器或归档程序选项放入列表文件,作为一种应对命令行长度限制的变通方法。 如需了解详情,请参阅
docs/ANDROID-MK.html
。
- 通过
- 其他的 bug 修复:
-
- 修复了
cpufeatures
辅助程序库中的android_getCpuCount()
实现。在内核由系统动态启用的特定设备上,之前的实现会在第一次调用此函数时报告活跃内核总数,而非实际存在的内核总数。
- 修复了
Android NDK r7b(2012 年 2 月)
此版本的 NDK 包含针对原生 Windows build 的修复、Cygwin 以及许多其他改进:
- 重要的 bug 修复:
-
- 更新了
sys/atomics.h
,以避免某些基于 ARM 的多核设备上的正确性问题。使用此版本的 NDK 重新编译未经修改的源代码即可完全消除此问题。如需了解详情,请参阅docs/ANDROID-ATOMICS.html
。 - 恢复为
binutils
2.19,以修复 NDK r7(改为binutils
2.20.1)中出现的调试问题。 - 修复了 32 位 Linux 上的
ndk-build
。NDK r7 中的打包错误会将 64 位版本的awk
可执行文件放在prebuilt/linux-x86/bin
下。 - 修复了原生 Windows 构建系统 (
ndk-build.cmd
)。其他构建模式不受影响。修复包括:- 移除了尝试从并非项目路径顶层的目录(例如,其中的任何子目录)中调用
ndk-build.cmd
时发生的无限循环/堆栈溢出 bug。 - 修复了自动生成的依赖项文件被忽略的问题。这意味着,更新头文件并不会触发对包含该头文件的源文件进行重新编译。
- 修复了无法正确处理文件或路径中所含特殊字符(空格和引号除外)的问题。
- 移除了尝试从并非项目路径顶层的目录(例如,其中的任何子目录)中调用
- 修复了独立工具链,确保使用
-lstdc++
(即,链接到 GNUlibstdc++
C++ 运行时)时能够生成正确的二进制文件。如果您想链接共享库版本,则应使用-lgnustl_shared
;如果想链接静态版本,则应使用-lstdc++
。如需详细了解此修复,请参阅
docs/STANDALONE-TOOLCHAIN.html
。 - 修复了 Cygwin 上的
gnustl_shared
。链接器之前会指出找不到libsupc++.a
,虽然此文件位于正确位置。 - 修复了不通过
APP_STL
使用任何特定 C++ 运行时的 Cygwin C++ 链接问题。
- 更新了
- 其他变更:
-
- 如果应用使用 GNU
libstdc++
运行时,则编译器不会再强制启用异常和 RTTI。此更改可减小代码大小。如果您需要这些功能,则必须执行下列其中一项操作:
- 在您的模块或
Application.mk
中明确启用异常和/或 RTTI。(推荐) - 在
Application.mk
中,将APP_GNUSTL_FORCE_CPP_FEATURES
定义为'exceptions'
和/或'rtti'
。如需了解详情,请参阅docs/APPLICATION-MK.html
。
- 在您的模块或
- 现在,当应用在独立进程中运行专用服务时,
ndk-gdb
可以正常运行。它会对主应用进程进行调试,而不会对ps
所列的第一个进程(通常是服务进程)进行调试。 - 修复了一个不常见的错误,其中 NDK r7 无法遵循
LOCAL_ARM_MODE
值,并始终将特定(但并非全部)源文件编译为 32 位指令。 STLport
:刷新源文件,以便与 Android 平台版本匹配。此更新可以修复几项不严重的错误:- 修复了不完整类型的实例化
- 修复了不严重的“==”与“=”拼写错误
- 在
string::assign
中使用了memmove
,而非memcpy
- 改进了对
IsNANorINF
、IsINF
、IsNegNAN
等的处理方式
如需了解完整详情,请参阅提交日志。
STLport
:从库中移除了 5 个非必要的静态初始化器。- 用于 armeabi-v7a 的 GNU libstdc++ 库错误地针对 armeabi 进行编译。此更改不影响正确性,但使用正确的 ABI 可以稍稍改进性能。
cpu-features
辅助程序库已更新为报告 3 项可选的 x86 CPU 功能(SSSE3
、MOVBE
和POPCNT
)。如需了解详情,请参阅docs/CPU-FEATURES.html
。docs/NDK-BUILD.html
已更新为指定NDK_APPLICATION_MK
而非NDK_APP_APPLICATION_MK
,以选择自定义Application.mk
文件。- Cygwin:在被调用时,
ndk-build
不再在当前目录中创建空的“NUL”文件。 - Cygwin:改进了自动依赖项检测功能。在之前的版本中,此检测功能在下列情况下无法正常运行:
- Cygwin 驱动器前缀并非
/cygdrive
时。 - 使用驱动较少的装载时,例如,Cygwin 将
/home
转换为\\server\subdir
而非C:\Some\Dir
。
- Cygwin 驱动器前缀并非
- Cygwin:
ndk-build
不会尝试将$NDK/prebuilt/windows/bin
下的原生 Windows 工具与特定版本的 Cygwin 和/或 GNU Make 配合使用。
- 如果应用使用 GNU
Android NDK r7(2011 年 11 月)
此版本的 NDK 包含支持 Android 4.0 平台的新功能,以及许多其他新增内容和改进:
- 新功能
-
- 添加了适用于 Android 4.0(API 级别 14)的正式 NDK API,以向平台添加下列原生功能:
- 根据 Khronos Group OpenMAX AL 1.0.1 标准添加了原生多媒体 API。新的
<OMXAL/OpenMAXAL.h>
和<OMXAL/OpenMAXAL_Android.h>
头文件允许以 API 级别 14 为目标的应用使用 Android 专用的新缓冲区队列接口,直接从原生代码中执行多媒体输出。如需了解详情,请参阅docs/openmaxal/index.html
和 http://www.khronos.org/openmax/。 - 根据 Khronos Group OpenSL ES 1.0.1 标准对原生音频 API 进行了更新。借助 API 级别 14,您现在可以将压缩的音频(例如,MP3、AAC 和 Vorbis 格式的音频)解码为 PCM 音频。如需了解详情,请参阅
docs/opensles/index.html
和 http://www.khronos.org/opensles/。
- 根据 Khronos Group OpenMAX AL 1.0.1 标准添加了原生多媒体 API。新的
- 添加了 CCache 支持。为了加快大规模重新编译的速度,请将
NDK_CCACHE
环境变量定义为ccache
(或定义为ccache
二进制文件的路径)。声明后,NDK 编译系统在编译任何源文件时都会自动使用 CCache。例如:export NDK_CCACHE=ccache
注意:CCache 未包含在 NDK 版本中,因此必须先安装才能使用。如需详细了解 CCache,请参阅 http://ccache.samba.org。
- 现已支持将
APP_ABI
设置为all
,以指出您想针对给定 NDK 版本所支持的所有 ABI 编译 NDK 模块。这意味着,在此版本中,Application.mk
中的以下两行是等效的:APP_ABI := all APP_ABI := armeabi armeabi-v7a x86
您也可以在从命令行调用
ndk-build
时定义APP_ABI
,这样可以快速确认项目是否针对所有受支持的 ABI 进行编译,而无需更改项目的Application.mk file
。例如:ndk-build APP_ABI=all
- 在
Android.mk
中添加了LOCAL_CPP_FEATURES
变量,以允许您声明模块要使用的 C++ 功能(RTTI 或异常)。这可确保在具备依赖于这些功能的预编译模块时,最终的链接可以正常运行。如需了解详情,请参阅docs/ANDROID-MK.html
和docs/CPLUSPLUS-SUPPORT.html
。 - 缩短了编译命令中使用的源文件和对象文件的路径。从项目路径中调用
$NDK/ndk-build
时,传递到编译命令的源文件路径、对象文件路径和二进制文件路径现已大幅缩短,因为它们以相对于当前目录的方式进行传递。这对编译具有大量源文件的项目来说十分有用,可以避免超过主机操作系统的最大命令行长度限制。从项目树的子目录中调用ndk-build
时,或将NDK_PROJECT_PATH
定义为指向特定目录时,此行为保持不变。
- 添加了适用于 Android 4.0(API 级别 14)的正式 NDK API,以向平台添加下列原生功能:
- 实验性功能
-
在 Windows 系统中,您现在可以在不借助 Cygwin 的情况下,通过在命令行从项目路径调用
ndk-build.cmd
脚本来编译 NDK 源文件。此脚本所采用的参数与原始ndk-build
脚本完全相同。Windows NDK 软件包随附自己的预编译二进制文件,适用于 GNU Make、Awk 以及编译所需的其他工具。您无需安装任何其他软件,即可获得有效的编译系统。重要提示:
ndk-gdb
无法在 Windows 上运行,因此您仍需使用 Cygwin 进行调试。此功能仍处在实验阶段,因此您可随意试用,并在公共错误数据库或公共论坛中报告问题。NDK 随附的所有示例和单元测试都可使用此功能成功完成编译。
- 重要的 bug 修复
-
- 现在如果
Application.mk
中未定义APP_MODULES
,导入的共享库会默认安装至目标安装位置 (libs/<abi>
)。例如,如果顶级模块foo
导入模块bar
,则libfoo.so
和libbar.so
都会复制至安装位置。之前,除非在APP_MODULES
中同时列出bar
,否则只复制libfoo.so
。如果您显式定义APP_MODULES
,则行为保持不变。 ndk-gdb
现在能够正确处理其 MAIN Intent 过滤器中具有多个类别的 Activity。- 静态库导入现在会正确传递。例如,如果顶级模块
foo
导入静态库bar
,而后者导入静态库zoo
,则libfoo.so
现在会同时链接到libbar.a
和libzoo.a
。
- 现在如果
- 其他变更
-
docs/NATIVE-ACTIVITY.HTML
:修复了拼写错误。对于原生 Activity,最低 API 级别应为 9,而不是 8。docs/STABLE-APIS.html
:添加了缺失的文档,将 EGL 列为受支持的稳定 API(从 API 级别 9 开始)。download-toolchain-sources.sh
:进行了更新,以从 AOSP 服务器的新位置 android.googlesource.com 下载工具链源文件。- 添加了新的 C++ 支持运行时,其名称为
gabi++
。如需了解详情,请参阅经过更新的docs/CPLUSPLUS-SUPPORT.html
。 - 添加了新的 C++ 支持运行时,其名称为
gnustl_shared
,并与 GNU libstdc++ v3 的共享库版本(GPLv3 许可)相对应。如需了解详情,请访问docs/CPLUSPLUS-SUPPORT.html
。 - 在 STLport C++ 运行时中添加了对 RTTI 的支持(不支持异常)。
- 在
LOCAL_CPP_EXTENSION
中添加了对多个文件扩展名的支持。例如,要将foo.cpp
和bar.cxx
都编译为 C++ 源文件,请进行如下声明:LOCAL_CPP_EXTENSION := .cpp .cxx
- 从 NDK 所提供的链接时共享系统库中移除了许多不需要的导出符号。这可确保使用独立工具链生成的代码没有意外依赖于非稳定 ABI 符号(例如,每当用来编译平台的工具链更改时都会更改的任何 libgcc.a 符号)的风险。
- 刷新了 EGL 和 OpenGLES Khronos 头文件,以支持更多扩展名。请注意,这不会更改相应库的 NDK ABI,因为客户端应用在运行时必须检测每个扩展名。
可用的扩展名取决于实际设备和 GPU 驱动程序,而非取决于设备所运行的平台版本。只是通过变更头文件添加新的常量和类型,以便在通过
eglGetProcAddress()
或glGetProcAddress()
检测扩展名时,能够更轻松地使用这些扩展名。以下列表介绍了最新支持的扩展名:- GLES 1.x
-
GL_OES_vertex_array_object
GL_OES_EGL_image_external
GL_APPLE_texture_2D_limited_npot
GL_EXT_blend_minmax
GL_EXT_discard_framebuffer
GL_EXT_multi_draw_arrays
GL_EXT_read_format_bgra
GL_EXT_texture_filter_anisotropic
GL_EXT_texture_format_BGRA8888
GL_EXT_texture_lod_bias
GL_IMG_read_format
GL_IMG_texture_compression_pvrtc
GL_IMG_texture_env_enhanced_fixed_function
GL_IMG_user_clip_plane
GL_IMG_multisampled_render_to_texture
GL_NV_fence
GL_QCOM_driver_control
GL_QCOM_extended_get
GL_QCOM_extended_get2
GL_QCOM_perfmon_global_mode
GL_QCOM_writeonly_rendering
GL_QCOM_tiled_rendering
- GLES 2.0
-
GL_OES_element_index_uint
GL_OES_get_program_binary
GL_OES_mapbuffer
GL_OES_packed_depth_stencil
GL_OES_texture_3D
GL_OES_texture_float
GL_OES_texture_float_linear
GL_OES_texture_half_float_linear
GL_OES_texture_npot
GL_OES_vertex_array_object
GL_OES_EGL_image_external
GL_AMD_program_binary_Z400
GL_EXT_blend_minmax
GL_EXT_discard_framebuffer
GL_EXT_multi_draw_arrays
GL_EXT_read_format_bgra
GL_EXT_texture_format_BGRA8888
GL_EXT_texture_compression_dxt1
GL_IMG_program_binary
GL_IMG_read_format
GL_IMG_shader_binary
GL_IMG_texture_compression_pvrtc
GL_IMG_multisampled_render_to_texture
GL_NV_coverage_sample
GL_NV_depth_nonlinear
GL_QCOM_extended_get
GL_QCOM_extended_get2
GL_QCOM_writeonly_rendering
GL_QCOM_tiled_rendering
- EGL
-
EGL_ANDROID_recordable
EGL_NV_system_time
Android NDK r6b(2011 年 8 月)
相较于 r6,此版本的 NDK 不包含任何新功能。r6b 版本解决了 r6 版本中存在的以下问题:
- 重要的 bug 修复
-
- 修复了使用
APP_ABI="armeabi x86"
进行多架构构建时的构建问题。 - 修复了 NDK 发布软件包中预构建 STLport 二进制文件的位置。 打包脚本中的错误导致这些二进制文件被放在错误的位置。
- 修复了共享库中
atexit()
与 x86standalone 工具链配合使用的问题。 - 修复了
make-standalone-toolchain.sh --arch=x86
。之前它无法将正确的 GNU libstdc++ 二进制文件复制至适当的位置。 - 修复了有关缺失
__dso_handle
符号的定义和大小的独立工具链链接器警告(仅限 ARM)。 - 修复了 x86 build 的
$(SYSROOT)/usr/include
的包含顺序。如需了解详情,请参阅相应错误。 - 修复了将
ptrdiff_t
和size_t
与 x86 独立工具链配合使用时,两者在特定于 x86 的系统中的定义。
- 修复了使用
Android NDK r6(2011 年 7 月)
此版本的 NDK 包含对 x86 ABI 的支持,以及其他次要变更。如需详细了解此版本中所含的变更,请参阅 NDK 软件包中随附的 CHANGES.HTML
文档。
- 一般说明:
-
- 添加了对 x86 ABI 的支持,以允许您生成可在基于 x86 的兼容 Android 设备上运行的机器代码。x86 的主要功能包括特定于 x86 的工具链、系统头文件、库和调试支持。如需了解有关 x86 支持的所有详情,请参阅 NDK 软件包中的
docs/CPU-X86.html
。默认情况下,系统会针对基于 ARM 的设备生成代码,但您可以在
Application.mk
文件的APP_ABI
定义中添加 x86,以面向 x86 平台进行构建。例如,下面这行代码会指示ndk-build
针对 3 个不同的 ABI 编译代码:APP_ABI := armeabi armeabi-v7a x86
除非您依赖于基于 ARM 的汇编源代码,否则无需处理
Android.mk
文件即可编译 x86 机器代码。 - 在调用
make-standalone-toolchain.sh
时,您可以使用--toolchain=x86-4.4.3
选项编译独立的 x86 工具链。如需了解详情,请参阅docs/STANDALONE-TOOLCHAIN.html
。 - 新的
ndk-stack
工具可以对logcat
中由原生代码生成的堆栈轨迹进行转换。此工具会将指令地址转换为可读格式,其中包含对应于每个堆栈帧的函数、源文件和行号等内容。如需了解详情及用法示例,请参阅docs/NDK-STACK.html
。
- 添加了对 x86 ABI 的支持,以允许您生成可在基于 x86 的兼容 Android 设备上运行的机器代码。x86 的主要功能包括特定于 x86 的工具链、系统头文件、库和调试支持。如需了解有关 x86 支持的所有详情,请参阅 NDK 软件包中的
- 其他变更:
- 从 NDK r5 开始废弃的
arm-eabi-4.4.0
已从 NDK 发行版中移除。
Android NDK r5c(2011 年 6 月)
相较于 r5b,此版本的 NDK 不包含任何新功能。r5c 版本解决了 r5 版本中的下列问题:
- 重要的 bug 修复:
-
ndk-build
:修复了在尝试对可调试项目执行并行构建时发生的一个罕见 bug。- 修复了导致
LOCAL_WHOLE_STATIC_LIBRARIES
无法与新工具链正常配合使用的拼写错误,并在docs/ANDROID-MK.html
中添加了有关此错误的文档。 - 修复了在 API 级别 8 (Android 2.2) 之前的平台版本上运行时,链接到
gnustl_static
的代码发生崩溃的 bug。 ndk-gdb
:修复了在调试搭载 Android 3.0 或更新版本的设备时导致分段错误的 bug。<android/input.h>
:API 级别 9 (Android 2.3) 中引入了两个错误的函数,现已修复。虽然这会破坏源 API,但系统的二进制接口保持不变。错误的函数缺少history_index
参数,而正确的定义如下所示:float AMotionEvent_getHistoricalRawX(const AInputEvent* motion_event, size_t pointer_index, size_t history_index); float AMotionEvent_getHistoricalRawY(const AInputEvent* motion_event, size_t pointer_index, size_t history_index);
- 更新了 API 级别 9 (Android 2.3) 的 C 库 ARM 二进制文件,以便在链接时正确公开在此 API 级别添加的新函数(例如
pthread_rwlock_init
)。
- 次要改进和修复:
-
- 对象文件现在会始终按其出现在
LOCAL_SRC_FILES
中的顺序进行链接。之前,由于文件是按源文件扩展名进行分组,因此并不会按此顺序进行链接。 - 当
import-module
失败时,它现在会输出搜索的目录列表。这对于确认编译系统所使用的NDK_MODULE_PATH
定义是否正确十分有用。 - 当
import-module
成功时,它现在会将模块所在的目录输出到日志中(可通过NDK_LOG=1
查看)。 - 加快了可调试应用的构建速度(当项目中存在大量包含目录时)。
ndk-gdb
:改进了adb shell
故障检测以及错误消息。<pthread.h>
:针对 API 级别 9 (Android 2.3) 及更高级别修复了PTHREAD_RWLOCK_INITIALIZER
的定义。- 修复了模块会导入自身,进而导致 GNU Make 中出现无限循环的问题。
- 修复了在
LOCAL_ARM_NEON
设置为 true 时,导致构建失败的 bug(build/core/build-binary.mk
中的拼写错误)。 - 修复了导致无法编译
.s
汇编文件(.S
文件不受影响)的 bug。
- 对象文件现在会始终按其出现在
Android NDK r5b(2011 年 1 月)
相较于 r5,此版本的 NDK 不包含任何新功能。r5b 版本解决了 r5 版本中的下列问题:
- r5 二进制文件需要 glibc 2.11,但是 r5b 二进制文件是使用面向 glibc 2.7 或更高版本的特殊工具链生成的。Linux 工具链二进制文件现在可在 Ubuntu 8.04 或更高版本上运行。
- 修复 arm-linux-androideabi-4.4.3 工具链中的编译器 bug。在处理带符号字符时,之前的二进制文件会生成无效的 Thumb 指令序列。
- 针对 APP_STL 的“gnustl_static”值添加了遗漏的文档,此值允许您链接到静态库版本的 GNU libstdc++。
- 修复了以下
ndk-build
问题:- 在 Windows 上发生编译错误时创建不一致的依赖项文件的错误。此错误导致更正源代码中的错误后无法正确执行编译。
- 特定于 Cygwin 的 bug:针对 Android NDK 安装或项目路径使用非常短的路径会导致生成无效的依赖项文件。此错误会导致无法执行增量编译。
- 导致 cpufeatures 库无法与新的 NDK 工具链正常配合使用的拼写错误。
- 通过避免针对每个源文件或对象文件都从 GNU Make 中调用
cygpath -m
(源代码树非常大时,这样调用会引起问题),加快了在 Cygwin 中构建的速度。如果此方法不可行,请在环境中定义NDK_USE_CYGPATH=1
以重新使用cygpath -m
。 - 现在在安装 Cygwin 时,若遇到包含空格的无效安装路径,系统会通知用户。之前,无效的路径会输出错误,以指出 GNU Make 版本不正确,即使安装了正确的版本也是如此。
- 修复了一个拼写错误,此错误会导致
NDK_MODULE_PATH
环境变量在包含以英文冒号分隔的多个目录时无法正常运行。 prebuilt-common.sh
脚本已进行多项修复,现可检查编译器是否生成了 64 位机器代码,而不是依赖于主机标记,从而使 32 位工具链可以在 Snow Leopard 上正确进行重新编译。工具链重新编译脚本现在也支持使用 32 位主机工具链。- 向
<netinet/in.h>
中添加了缺失的INET_ADDRSTRLEN
声明。 - 向
<netinet/in6.h>
中添加了缺失的IN6_IS_ADDR_MC_NODELOCAL
和IN6_IS_ADDR_MC_GLOBAL
。 - 在
<asm/byteorder.h>
中,“asm”已替换为“__asm__”,以便使用-std=c99
进行编译。
Android NDK r5(2010 年 12 月)
此版本的 NDK 包含许多新的 API,其中的大部分都是为了支持开发游戏及大量使用原生代码的类似应用而引入的。开发者可以通过使用这些 API,对事件、音频、图形及窗口管理、资源和存储空间进行直接的原生访问。得益于新的 NativeActivity
类,开发者还可以在原生代码中实现 Android 应用生命周期:如需详细了解此版本中所含的变更,请参阅下载的 NDK 软件包中随附的 CHANGES.HTML
文档。
- 一般说明:
-
- 添加了对原生 Activity 的支持,使您能够在原生代码中实现 Android 应用生命周期。
- 添加了对下列各项的原生支持:
- 输入子系统(例如,键盘和触摸屏)
- 访问传感器数据(加速度计、指南针、陀螺仪等)
- 事件循环 API,用于等待输入和传感器事件等
- 窗口和 Surface 子系统
- 基于 OpenSL ES 标准的音频 API,支持播放和录制,以及控制平台音效
- 访问打包到
.apk
文件中的资源
- 包含了新的工具链(基于 GCC 4.4.3),它可以生成性能更优异的代码,现在还可用作独立的交叉编译器,以供希望使用
./configure && make
构建应用的人使用。如需了解详情,请参阅 docs/STANDALONE-TOOLCHAIN.html。仍提供 GCC 4.4.0 的二进制文件,但移除了 4.2.1 的二进制文件。 - 添加了对预编译的静态及共享库 (docs/PREBUILTS.html) 以及模块导出和导入的支持,大大简化了第三方模块的共享和重复使用过程(docs/IMPORT-MODULE.html 说明了原因)。
- 提供了默认的 C++ STL 实现(基于 STLport)作为辅助程序模块。它可用作静态库或共享库(如需了解详情及用法示例,请访问 sources/android/stlport/README)。此外,还会提供 STLport(静态或共享)和 GNU libstdc++(仅限静态)的预编译二进制文件,前提是您选择根据这些库(而非默认的 C++ STL 实现)进行编译。C++ 异常和 RTTI 在默认的 STL 实现中不受支持。如需了解详情,请参阅 docs/CPLUSPLUS-SUPPORT.HTML。
- 对
cpufeatures
辅助程序库进行了改进,以改进 CPU 类型的报告(之前某些设备会报告 ARMv7 CPU,但设备实际上是 ARMv6)。我们建议使用这个库的开发者重新编译其应用,然后上传到 Google Play 以从改进中受益。 - 添加了一个 EGL 库,使您能够创建和管理 OpenGL ES 纹理及服务。
- 添加了新的示例应用
native-plasma
和native-activity
,以演示如何编写原生 Activity。 - 包含了许多 bug 修复和其他次要改进;如需更详细的变更列表,请参阅 docs/CHANGES.html。
Android NDK r4b(2010 年 6 月)
- NDK r4b 说明:
-
包含了针对 NDK 编译系统和调试脚本中多个问题的修复;如果您使用的是 NDK r4,我们建议您下载 NDK r4b 编译系统。如需关于此版本中所作变更的详细信息,请参阅下载的 NDK 软件包中随附的 CHANGES.TXT 文档。
- 一般说明:
-
- 通过新的
ndk-build
构建命令提供了简化的构建系统。 - 通过新的
ndk-gdb
命令支持在正式版设备上对生成的机器代码进行简易原生调试。 - 针对基于 ARM 的 CPU 架构,添加了 Android 专用的新 ABI
armeabi-v7a
。这一新 ABI 可以扩展现有的armeabi
ABI 以包含下列 CPU 扩展指令集:- Thumb-2 指令
- VFP 硬件 FPU 指令 (VFPv3-D16)
- 针对 ARM Advanced SIMD (NEON) GCC 内建函数和 VFPv3-D32 的可选支持。提供支持的设备包括 Motorola 的 Verizon Droid、Google Nexus One 等等。
- 添加了新的
cpufeatures
静态库(包含源代码),使您的应用能够在运行时检测主机设备的 CPU 功能。具体而言,应用可以检查是否支持 ARMv7-A 以及是否支持 VFPv3-D32 和 NEON,然后根据需要提供单独的代码路径。 - 添加了示例应用
hello-neon
,此示例演示了如何使用cpufeatures
库检查 CPU 功能,然后使用 NEON 内建函数提供优化的代码路径(如果受 CPU 支持)。 - 允许您针对 NDK 所支持的任一或全部指令集生成机器代码。例如,您可以同时针对 ARMv5 和 ARMv7-A 架构进行编译,并将所有内容存储到应用的最终
.apk
中。 - 为确保仅在用户设备能够运行您的应用时才向其提供应用,Google Play 现在会根据应用中包含的指令集信息过滤应用,而您自己无需执行任何操作即可启用过滤。此外,Android 系统本身也会在安装时检查您的应用,并且仅在此应用提供针对设备 CPU 架构进行编译的库时,才允许继续安装。
- 添加了对 Android 2.2 的支持,其中包括一个新增的稳定 API,用于从原生代码中访问
Bitmap
对象的像素缓冲区。
- 通过新的
Android NDK r3(2010 年 3 月)
- 一般说明:
-
- 添加了 OpenGL ES 2.0 原生库支持。
- 添加了示例应用
hello-gl2
,此示例演示了如何使用 OpenGL ES 2.0 顶点和 Fragment 着色器。 - 在此版本中,工具链二进制文件已使用 GCC 4.4.0 进行更新,与前一版本 (4.2.1) 相比,生成的机器代码略为紧凑而高效。同时,NDK 仍提供 4.2.1 二进制文件,供您有选择地用于构建机器代码。
Android NDK r2(2009 年 9 月)
最初以“Android 1.6 NDK,第 1 版”的形式发布。
- 一般说明:
-
- 添加了 OpenGL ES 1.1 原生库支持。
- 添加了示例应用
san-angeles
,此应用可以通过原生 OpenGL ES API 渲染 3D 图形,同时使用GLSurfaceView
对象管理 Activity 生命周期。
Android NDK r1(2009 年 6 月)
最初以“Android 1.5 NDK,第 1 版”的形式发布。
- 一般说明:
-
- 提供了针对 ARMv5TE 指令(包括 Thumb-1 指令)的编译器支持 (GCC)。
- 提供了针对稳定的原生 API、文档和示例应用的系统头文件。