此页面提供了有关所有已发布的 NDK 稳定版本中更改的信息。要下载最新版本的 NDK 或任何当前可用的测试版,请参阅 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 更新为 clang-r450784d,基于 LLVM 14 开发。
Android NDK r24 (2022 年 3 月)
更改日志- 下载
-
- 此版本的下载地址为 此处。
- 公告
-
- 已删除 GNU 汇编程序 (GAS)。如果您使用
-fno-integrated-as
构建,则需要删除该标志。请参阅 Clang 迁移说明 获取有关使汇编程序与 LLVM 兼容的建议。 - 已删除 GDB。请使用 LLDB。请注意,ndk-gdb 默认情况下使用 LLDB,而 Android Studio 一直只支持 LLDB。
- 不再支持 Jelly Bean (API 16、17 和 18)。NDK 支持的最低操作系统是 KitKat (API 级别 19)。
- 不再支持非 Neon 设备。极少数非常旧的设备不支持 Neon,因此除了性能提升外,大多数应用不会注意到这一点。
- 已删除 RenderScript 构建支持。RenderScript 在 Android 12 中已 不再推荐使用。如果您尚未完成将应用迁移出 RenderScript,则可以使用 NDK r23 LTS。
- 已删除 GNU 汇编程序 (GAS)。如果您使用
Android NDK r23 LTS (2021 年 8 月)
更改日志- 下载
-
- 此版本的下载地址为 此处。
- 公告
-
- 已删除除 GNU 汇编程序 (GAS) 之外的 GNU binutils。GAS 将在下一个版本中删除。如果您使用
-fno-integrated-as
构建,如果任何因素阻止您删除该标志,请提交错误报告。 - 已结束对 GDB 的支持。GDB 将在下一个版本中删除。请使用 LLDB。请注意,
ndk-gdb
默认情况下使用 LLDB。 - NDK r23 是最后一个支持非 Neon 的版本。从 NDK r24 开始,sysroot 中的 armeabi-v7a 库将使用 Neon 构建。极少数非常旧的设备不支持 Neon,因此除了性能提升外,大多数应用不会注意到这一点。
- Jelly Bean (API 16、17 和 18) 将在下一个 NDK 版本中不再支持。NDK r24 支持的最低操作系统是 KitKat (API 级别 19)。
- 已删除除 GNU 汇编程序 (GAS) 之外的 GNU binutils。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 将随之而来(时间表未知)。通过在链接时传递
-fuse-ld=lld
,在您的应用中测试 LLD。请注意,问题 843 会影响使用 LLD 构建,使用 binutils strip 和 objcopy 而不是 llvm-strip 和 llvm-objcopy。 - 传统的工具链安装路径将在接下来的版本中删除。这些路径自 NDK r19 以来已过时,并在 NDK 中占用大量空间。将被删除的路径包括
- 平台
- sources/cxx-stl
- sysroot
- toolchains(除了 toolchains/llvm)
make_standalone_toolchain.py
用户也不受影响(尽管该脚本自 r19 以来已不再必要)。有关迁移出旧版工具链布局的信息,请参阅您正在使用的 NDK 版本的 构建系统维护者指南。 - Play 商店从 2019 年 8 月开始上传 APK 时,将需要 64 位支持。现在就开始移植,以免到时出现意外。有关更多信息,请参阅 这篇文章。
- 现在可以从我们的 wiki 和网站下载已签名和公证的 macOS 应用程序包。请注意,由于只有包可以使用 RPATH 并通过公证,因此传统的 macOS NDK 包**不能**进行公证。SDK 将继续使用传统软件包,因为应用程序包需要布局更改,这会使其与 Android Studio 不兼容。当通过 SDK 管理器下载 NDK 时,它不会被隔离,因此目前被 Gatekeeper 允许。**SDK 管理器目前是获取 macOS NDK 的最可靠方法。**
-
Android NDK r20b (2019 年 6 月)
更改日志Android NDK r19c (2019 年 1 月)
更改日志- 下载
-
- 此版本的下载地址:这里。
- 公告
-
- 开发人员应开始使用 LLD 测试他们的应用程序。AOSP 已切换为默认使用 LLD,NDK 将在下一个版本中默认使用它。一旦 LLD 经过一个发布周期且没有重大未解决问题(估计为 r21),BFD 和 Gold 将被删除。通过在链接时传递
-fuse-ld=lld
来在您的应用中测试 LLD。注意:lld 目前不支持 Windows 上的压缩符号。 Issue 888。Clang 也不能在 Windows 上生成压缩符号,但这在使用从 Darwin 或 Linux 生成的工件时可能会成为问题。 - Play 商店从 2019 年 8 月开始上传 APK 时,将需要 64 位支持。现在就开始移植,以免到时出现意外。有关更多信息,请参阅 这篇文章。
-
Issue 780: 独立工具链 现在已不再必要。Clang、binutils、sysroot 和其他工具链部分现在都安装到
$NDK/toolchains/llvm/prebuilt/<host-tag>
,Clang 将自动找到它们。无需为 API 26 ARM 创建独立工具链,而是直接从 NDK 调用编译器。$ $NDK/toolchains/llvm/prebuilt/
对于 r19,工具链也安装到旧路径,以便构建系统有机会适应新的布局。旧路径将在 r20 中删除。/bin/armv7a-linux-androideabi26-clang++ src.cpp make_standalone_toolchain.py
脚本不会被删除。它现在已不再必要,并将发出包含上述信息的警告,但该脚本将保留以保持现有的工作流程。如果您使用的是 ndk-build、CMake 或独立工具链,那么您的工作流程应该没有变化。此更改对第三方构建系统的维护者意义重大,他们现在可以删除一些特定于 Android 的代码。有关更多信息,请参阅 构建系统维护者 指南。 - ndk-depends 已被删除。我们认为 ReLinker 是在旧版 Android 版本上解决本机库加载问题的更好的解决方案。
- Issue 862: 重定向到 Clang 的 GCC 包装器脚本已被删除,因为它们的功能不足以作为直接替换。
- 开发人员应开始使用 LLD 测试他们的应用程序。AOSP 已切换为默认使用 LLD,NDK 将在下一个版本中默认使用它。一旦 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 将导致错误。
- 对 ICS(android-14 和 android-15)的支持将从 r18 中删除。
- Play 商店从 2019 年 8 月开始上传 APK 时,将需要 64 位支持。现在就开始移植,以免到时出现意外。有关更多信息,请参阅 这篇文章。
Android NDK r16b (2017 年 12 月)
更改日志- 下载
- 此版本的下载地址:这里。
- 公告
-
- 已删除弃用的头文件。 统一头文件 现在简称为“头文件”。有关迁移提示,请参阅 统一头文件迁移说明。
- GCC 不再受支持。它尚未从 NDK 中删除,但不再接收移植。在 libc++ 变得足够稳定以成为默认 STL 之前,它无法被删除,因为 gnustl 的某些部分仍然与 Clang 不兼容。它将在其他 STL 从 r18 中删除时删除。
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 之前,它无法被删除,因为 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 架构上运行。要了解更多信息,请参阅 构建汇编代码。
注意:弃用的头文件将在即将发布的版本中删除。如果您遇到与这些头文件相关的任何问题,请提交 错误。
有关迁移提示,请参阅 统一头文件迁移说明。
- API
-
新增了针对 Android 8.0 的本机 API。要了解有关这些 API 的更多信息,请参阅 本机 API 概述。
有关此版本中新增内容和更改内容的更多信息,请参阅这篇文章:变更日志。
Android NDK r14b (2017 年 3 月)
更改日志- 下载
- 此版本的下载地址:这里。
- 公告
-
- 统一头文件:此版本引入了与 Android 平台同步并始终保持最新和准确的平台头文件。现在,仅头文件修复会影响所有 API 级别。统一头文件的引入修复了早期 NDK 版本中存在的不一致性,例如
- M 和 N 中的头文件实际上是 L 的头文件。
- 头文件中函数声明与其平台级别不匹配;头文件声明了不存在的函数或未声明可用的函数。
- 许多旧的 API 级别缺少或包含不正确的常量,而这些常量存在于较新的 API 级别中。
这些新的统一头文件默认情况下未启用。要了解如何启用和使用这些头文件,请参阅 统一头文件。
- GCC 弃用:此版本终止了对 GCC 的积极支持。GCC 尚未从 NDK 中删除,但将不再接收移植。由于 gnustl 的某些部分仍然与 Clang 不兼容,因此 GCC 将在 libc++ 变得足够稳定以成为默认 STL 之前不会完全删除。
- 统一头文件:此版本引入了与 Android 平台同步并始终保持最新和准确的平台头文件。现在,仅头文件修复会影响所有 API 级别。统一头文件的引入修复了早期 NDK 版本中存在的不一致性,例如
有关此版本中新增内容和更改内容的更多信息,请参阅这篇文章:变更日志。
Android NDK r13b (2016 年 10 月)
- 下载
- 此版本的下载地址:这里。
- 公告
-
- GCC 不再受支持。它尚未从 NDK 中删除,但不再接收移植。在 libc++ 变得足够稳定以成为默认 STL 之前,它无法被删除,因为 gnustl 的某些部分仍然与 Clang 不兼容。它很可能在那之后被删除。
- 新增了 simpleperf,一款用于 Android 的 CPU 分析器。
- r13b
-
-
其他修复,以解决缺少的
__cxa_bad_cast
。
-
其他修复,以解决缺少的
- NDK
-
NDK_TOOLCHAIN_VERSION
现在默认使用 Clang。- libc++ 已更新至 r263688。
- 我们已重置为(几乎)干净的上游。这应该会消除许多错误,但我们仍然需要清理 libandroid_support,然后我们才会建议将其作为默认值。
-
make-standalone-toolchain.sh
现在只是一个围绕工具的 Python 版本的包装器。存在一些行为差异。有关详细信息,请参阅 提交信息。 - 已删除针对不受支持的 ABI 的一些库(mips64r2、mips32r6、mips32r2 和 x32)。可能仍然存在一些遗漏。
- 已解决与 crtbegin_static.o 相关的问题,这些问题会导致在为 ARM android-21+ 构建静态可执行文件时链接时缺少 atexit:Issue 132
- 在 build/cmake/android.toolchain.cmake 中添加了 CMake 工具链文件。
- 已知问题
Android NDK r12b (2016 年 6 月)
- 下载
- 此版本的下载已归档 此处。
- 公告
- 在 r13 中,
ndk-build
命令默认使用 Clang。我们将在后续版本中移除 GCC。 - 在 r13 中将移除
make-standalone-toolchain.sh
脚本。请确保make_standalone_toolchain.py
符合您的需求。 - 向 GitHub 报告问题。
- 我们已修复了
ndk-gdb.py
。(问题 118) - 我们已更新了
NdkCameraMetadataTags.h
,使其不再包含无效的枚举值。 - 已修复 ndk-build 中的一个错误,该错误导致使用 libc++ 的静态库出现虚假警告。有关此更改的更多信息,请参阅 此处 的注释。
- 已更新 android-24 的 OpenSLES 头文件。
- NDK
- 我们已移除对 armeabi-v7a-hard ABI 的支持。有关更多信息,请参阅此 解释。
- 已移除所有针对 GB 前平台级别的 sysroot。我们在 r11 中取消了对它们的 支持,但忽略了实际移除它们。
- 在 ARM32 上使用 c++_shared 时,异常处理现在基本可以正常工作。展开器现在将链接到每个链接对象,而不是链接到 libc++ 本身。有关此异常处理的更多信息,请参阅 已知问题。
- 已修剪默认编译器标志。(问题 27).
- 有关这些更改的完整信息,请参阅 此更改列表。
- 添加了独立工具链的 Python 实现:
build/tools/make_standalone_toolchain.py
。- Windows 用户不再需要 Cygwin 才能使用此功能。
- 我们将在 r13 中移除 bash 风格,因此请现在测试新的风格。
-fno-limit-debug-info
已默认启用,用于 Clang 调试版本。此更改应改善与 LLDB 的调试能力。--build-id
现在已默认启用。- 构建 ID 现在将显示在本地崩溃报告中,因此您可以轻松识别正在运行的代码版本。
NDK_USE_CYGPATH
不应该再导致 libgcc 出现问题。(Android 问题 195486)- 现在已默认启用以下选项:
-Wl
、--warn-shared-textrel
和-Wl,--fatal-warnings
。如果您有共享文本重定位,您的应用无法在 Android 6.0(API 级别 23)或更高版本上加载。文本重定位从未允许用于 64 位应用。 - 预编译头文件应能更好地工作。(问题 14 和 问题 16)
- 已移除无法访问的 ARM(非拇指)STL 库。
- 已将 Vulkan 支持添加到 android-24。
- 已将 Choreographer API 添加到 android-24。
- 为支持
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 版本中的动态链接器错误。 - NDK r11 KI 针对
dynamic_cast
不适用于 Clang。我们已修复 x86、stlport_static
和优化。 - GDB
- 已更新至 GDB 7.11。有关更多信息,请参阅 GDB 新闻 页面。
- 针对
ndk-gdb.py
的一些错误修复。 - 已知问题
- x86 ASAN 仍然无法正常工作。有关更多信息,请参阅此 更改列表 上的讨论。
- 在 Android 2.3(API 级别 9)或 Android 4.0(API 级别 14)上,使用
c++_shared
的异常展开仍然无法正常工作。 - 尽管存在 android-24,但尚未公开 Android 6.0(API 级别 23)和 Android 7.0(API 级别 24)的 Bionic 头文件和库。这些平台仍然使用 Android 5.0(API 级别 21)的头文件和库(不是从 r11 开始的回归)。
- RenderScript 工具不存在(不是从 r11 开始的回归)。(问题 7)
- 此更改日志并非旨在成为所有未解决错误的完整列表。
__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(非拇指)STL 库。
- 已将 Vulkan 支持添加到 android-24。
- 已将 Choreographer API 添加到 android-24。
- 为支持
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 版本中的动态链接器错误。 - 已修复 NDK r11 中的一个已知问题,即
dynamic_cast
不适用于 Clang、x86、stlport_static 和优化。 - GDB
- 已更新至 GDB 版本 7.11。有关此版本的更多信息,请参阅 GDB 新闻。
- 已修复
ndk-gdb.py
脚本中的一些错误。 - 已知问题
- x86 地址清理器 (ASAN) 目前无法正常工作。有关更多信息,请参阅 问题 186276。
- 在 Android 2.3(API 级别 9)或 Android 4.0(API 级别 14)上,使用
c++_shared
的异常展开仍然无法正常工作。 - 尽管存在 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
-
- 勘误
- 与我们在 r11 版本说明中报告的不同,
__thread
不起作用。这是因为我们提供的 Clang 版本缺少模拟 TLS 支持的错误修复。
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。之前,它与 r214835 同步。
- NDK
-
- 重要公告
- 示例不再包含在 NDK 包中。它们现在在GitHub 上提供。
- 文档不再包含在 NDK 包中。相反,它位于Android 开发者网站 上。
- 新增
- 向
android-23
添加了本地跟踪 API。 - 向
android-23
添加了本地多网络 API。 - 从 API 级别 21 开始,启用 libc、m 和 dl 来提供版本化符号。
- 将 Vulkan 标头和库添加到 API 级别 N。
- 向
- 删除
- 删除了对
_WCHAR_IS_8BIT
的支持。 - 删除了 sed。
- 删除了 mclinker。
- 删除了 Perl。
- 从所有版本的 NDK libc、m 和 dl 中删除了平台版本这些库不支持的所有符号。
- 部分删除了对 mips64r2 的支持。其余部分将在将来删除。
- 删除了对
- 其他更改
- 将 ARM 独立工具链更改为默认使用 arm7。
- 您可以通过将
-target
选项指定为armv5te-linux-androideabi
来恢复旧的行为。
- 您可以通过将
- 将构建系统更改为对平台包含使用
-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。
- 更新了
byteswap.h
、endian.h
、sys/procfs.h
、sys/ucontext.h
、sys/user.h
和uchar.h
,来自 ToT Bionic。 - 跨所有 API 级别同步了
sys/cdefs.h
。 - 修复了 arm 的
fegetenv 和 fesetenv
。 - 修复了 mips64 和 x86_64 的
crtend_*
的结束指针大小/对齐方式。
- 重要公告
- Binutils
-
- 新增
- 添加了一个新选项:
--pic-veneer
。
- 添加了一个新选项:
- 删除
- 32 位 Windows 包不再包含 ld.gold。您可以从 64 位 Windows 包中获取 ld.gold。
- 更改
- 统一了 Android 和 ChromiumOS 之间的 binutils 源代码。有关此更改的更多信息,请参阅此处的注释。
- 提高了 Gold 对 aarch64 的可靠性。在链接时使用
-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 勘误 843419 的解决方法集成到
aarch64-linux-android-4.9
链接器中。有关此解决方法的更多信息,请参阅Cortex-A53 勘误 843419 的解决方法。 - 添加了 Clang 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 勘误 843419 的解决方法集成到
- 重要的错误修复
-
- 修复了在主线程之外存在 OpenMP 循环时发生的崩溃。
- 修复了当用户声明
#pragma GCC optimize ("O0")
,但在命令行中指定了不同的优化级别时发生的 GCC 4.9 内部编译器错误 (ICE)。pragma
优先级更高。 - 修复了以前会产生崩溃的错误,并显示以下错误消息
in add_stores, at var-tracking.c:6000
- 为 Clang 3.5 中的一个问题实施了解决方法,该问题中 LLVM 自动向量化会生成
llvm.cttz.v2i64()
,这是一个在 ARM 指令集中没有对应指令的指令。
- 其他错误修复
-
- 对以下标头和库进行了修复
- 修复了
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 的警告是无条件禁用的。
- 修复了 Clang 3.5 为
mips
和mips64
创建可写.gcc_except_table
部分的问题,从而与 GCC 行为匹配。此更改允许您避免以下链接器警告.../ld: warning: creating a DT_TEXTREL in a shared object
- 回退了对
compiler-rt
问题的修复,这些问题会导致 Clang 为mips64
编译时发生崩溃。有关更多信息,请参阅 LLVM 问题 20098。 - 修复了 Clang 3.5 在非 ASCII 注释上发生的崩溃。(问题 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) - 修复了在通过执行
ndk-build.cmd
命令从gradle
编译单个.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 的默认选项。 - 为 ARM、AArch64、X86 和 X86_64 工具链的 GCC 4.9、Clang 3.5 和 Clang 3.6,将
-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 4.6,将在下次发布时将其移除。要恢复以前的行為,请将
NDK_TOOLCHAIN_VERSION=4.6
添加到 ndk-build,或在命令行上执行make-standalone-toolchain.sh
时添加--toolchain=arm-linux-androideabi-4.6
。GCC 4.9 仍然是 64 位 ABI 的默认值。 - 停止所有 x86[_64] 工具链默认添加
-mstackrealign
。NDK 工具链假定 16 字节的堆栈对齐。默认情况下使用的工具和选项将强制执行此规则。编写汇编代码的用户必须确保保留堆栈对齐,并确保其他编译器也符合此规则。(GCC 错误 38496) - 将地址消毒功能添加到 Clang 3.5 支持,以支持 ARM 和 x86 ABI。有关此更改的更多信息,请参阅 地址消毒 项目。
- 从 API 级别 21 开始,引入了在构建时使用
-fPIE -pie
的要求。在 API 级别 16 及更高版本中,ndk-build 在构建时使用PIE
。此更改具有许多含义,这些含义在 开发者预览版问题 888 中进行了讨论。这些含义不适用于共享库。
- 将 GCC 4.8 设为所有 32 位 ABI 的默认值。已弃用 GCC 4.6,将在下次发布时将其移除。要恢复以前的行為,请将
- 重要的错误修复
-
- 在 aarch64-linux-android-4.9 链接器中,对 A53 勘误 #835769 做出了更多修复。作为此的一部分,GCC 在指定
-mfix-cortex-a53-835769
(默认情况下启用)时传递一个新的选项--fix-cortex-a53-835769
。有关更多信息,请参阅此 binutils 消息 和此 binutils 消息。 - 记录了对 libc++
sscanf/vsscanf
挂起的修复,该挂起发生在 API 级别 21 中。修复本身已在 r10c 中实现。(问题 77988) - 修复了在 GCC 4.9 中指定
-Os
时发生的 AutoFDO (-fauto-profile
) 崩溃。(问题 77571)
- 在 aarch64-linux-android-4.9 链接器中,对 A53 勘误 #835769 做出了更多修复。作为此的一部分,GCC 在指定
- 其他错误修复
-
- 对以下标头和库进行了修复
- 将
posix_memalign
添加到 API 级别 16。此外,在stdlib.h
中添加了一个原型到 API 级别 16 到 19。(问题 77861) - 修复了
stdatomic.h
,使其仅在 C++11 中包含<atomic>
。 - 修改了以下标头以供独立使用:
sys/user.h
以及gl2ext.h
、dlext.h
、fts.h
、sgidefs.h
,用于 API 级别 21。 - 修改了
sys/user.h
,将mxcsr_mask
重命名为mxcr_mask
,并将u_ar0
的数据类型 从 - 将
sysconf()
的返回值类型从int
更改为long
。 - 修复了 ndk-build 对
thumb
的处理方式,用于LOCAL_ARM_MODE
:在 r10d 中,ndk-build 默认添加LOCAL_LDFLAGS+=-mthumb
,除非以下条件之一适用 - 您已将
LOCAL_ARM_MODE
设置为等于arm
。 - 您正在进行调试构建(使用
APP_OPTIM=debug
和AndroidManifest.xml
包含android:debuggable="true"
之类的设置),其中 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-on
选项,可以使在使用 ART 作为虚拟机在 Android 5.0 设备上调试时,进入 ART 调试模式。有关更多信息,请参阅包含 NDK 的目录中的prebuilt/common/gdb/common.setup
。 - 删除了对 Clang 3.3 的支持。
- 已弃用 GCC 4.6,可能会将其从将来的版本中移除。
- 将 mclinker 更新到 2.8,并支持相同代码折叠(“ICF”)。使用
--icf
选项指定 ICF。 - 在 x86 和 x86_64 中扩展了
arm_neon.h
支持,覆盖了约 93% 的 NEON 内在函数。有关 NEON 支持的更多信息- 导航到 NDK 程序员指南 (
docs/Programmers_Guide/html/
),然后查看体系结构和 CPU > Neon。 - 检查
samples/
中更新的hello-neon
示例。 - 请参阅英特尔的指南,了解如何从 ARM NEON 移植到英特尔 SSE: 从 ARM NEON 移植到英特尔 SSE 的解决方案。
- 导航到 NDK 程序员指南 (
- 记录了对
headers/libs/android-21
中的_FORTIFY_SOURCE
的支持,该支持出现在 r10 中(当时android-21
仍然称为Android-L
),但没有文档。
有关更详细的信息,请参阅下面的“重要错误修复”。
从使用 GCC 的项目迁移时,您可以使用
-Wno-invalid-command-line-argument
和-Wno-unused-command-line-argument
来忽略未使用的标志,直到您能够决定长期如何处理它们。 - 重要的错误修复
-
- 修复了 GCC4.9/aarch64 的内部编译器错误,该错误导致以下错误消息(问题 77564)
internal compiler error: in simplify_const_unary_operation, at simplify-rtx.c:1539
- 修复了 GCC4.9/arm 的错误代码生成。(问题 77567)
- 修复了 GCC4.9/mips 中涉及内联汇编的内部编译器错误。(问题 77568)
- 修复了 GCC4.9/arm 为
x = (cond) ? y : x
生成的错误代码。(问题 77569)- 修复了 GCC4.9/aarch64 和 Clang3.5/aarch64,默认情况下通过指定
-mno-fix-cortex-a53-835769
来解决 Cortex-A53 勘误(835769)。禁用解决方法。 - 其他错误修复
-
- 对
android-21
进行了以下标头和库修复- 添加了更多电视键码:
android/keycodes.h
- 在
android/sensor.h
中添加了更多常量和六个新的传感器函数:ASensorManager_getDefaultSensorEx
、ASensor_getFifoMaxEventCount
、ASensor_getFifoReservedEventCount
、ASensor_getStringType
、ASensor_getReportingMode
以及ASensor_isWakeUpSensor
。 - 修复了
stdatomic.h
,以提高与 GCC 4.6 的兼容性,并提供对<atomic>
标头的支持。 - 将
sys/ucontext.h
和sys/user.h
添加到所有 API 级别。signal.h
标头现在包含<sys/ucontext.h>
。您可以删除任何现有的struct ucontext
定义。 - 将
posix_memalign
添加到 API 级别 17、18 和 19。 - 将以下函数添加到所有体系结构:
android_set_abort_message
、posix_fadvise
、posix_fadvise64
、pthread_gettid_np
。 - 将必需的权限添加到
native-media/AndroidManifest.xml
示例。(问题 106640) - 将
clock_nanosleep
和clock_settime
添加到 API 级别 21。(问题 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
。 - 在以下函数中,将第三个参数的类型从
size_t
更改为int
:strtoll_l
、strtoull_l
、wcstoll_l
以及wcstoull_l
。 - 将以下函数恢复到 64 位体系结构:
arc4random
、arc4random_buf
以及arc4random_uniform
。 - 将
cxa_*
以及new
和delete
运算符移回libstdc++.so
。此更改恢复了 r9d 行為;r10 的先前版本包含占位符文件。
- 添加了更多电视键码:
- 在 GCC 4.8 和 4.9 中为 mips 恢复了 MXU 支持。此支持已从 r10 和 r10b 中消失,因为这些版本的 GCC 是使用 binutils-2.24 编译的,而 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指定了它,而不是*-ar
。此设置带来了改进的LTO支持。 - 从GCC编译器中删除了
include-fixed/linux/a.out.h
和include-fixed/linux/compiler.h
头文件。(问题73728) - 修复了与Mac OS X上的GCC 4.8有关的
-flto
问题。错误消息显示为
.../ld: error: .../libexec/gcc/arm-linux-androideabi/4.9/liblto_plugin.so Symbol not found: _environ
- 修复了
build-binary.mk.
中的拼写错误。(问题76992) - 增强了
- 重要的已知问题
-
- 在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支持是适用于Android 4.4(API级别19)的32位Renderscript。您无法使用其他任何Renderscript(32位或64位)和Android版本的组合来构建HelloComputeNDK(唯一的Renderscript示例)。
- 要编译native-codec,您必须使用64位NDK软件包,其中包含所有Android-L头文件。
- 重要的错误修复
- 其他错误修复
-
- 从所有版本的GCC的
include-fixed/
目录中删除了stdio.h
。(问题73728。) - 从Windows软件包的
platforms/android-L/arch-*/usr/include/linux/netfilter*/
目录中删除了重复的头文件。(问题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
,实现了新的multilib目录布局,并提供了对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预览版。实际的API级别编号将在L正式版发布时替换它。
- 此版本现在包括
all32
和all64
设置,用于APP_ABI
。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
以查看是否存在具有该名称的函数,以避免链接器出现“多重定义”错误。 - cpu-features库已针对ARMv8内核进行了更新。现有的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中的单精度浮点音频格式。 - GLES 3.1和AEP扩展到
libGLESv3.so.
。 - 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版。由于GDB在GCC 4.6(ARM和MIPS的默认值)中仍然是GDB-7.3.x版,您必须设置
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++支持”部分。请注意
- 除locale之外的所有测试现在都通过了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不再重新构建libc++。重新构建它需要使用不同的编译器。请注意,Clang 3.3尚未经过测试。
- mclinker现在是2.7版,并具有aarch64 Linux支持。
- 添加了对由
LOCAL_PCH
指定的头文件的预编译头支持。(问题25412)。
- 重要的错误修复
-
- 修复了libc++,使其现在可以编译
std::feof
等。(问题66668)。 - 修复了Clang 3.3/3.4原子库调用,该调用导致某些ABI armeabi的libc++测试中出现崩溃。
- 修复了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++,使其现在可以编译
- 其他错误修复
-
- 修复了头文件
- 将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随附的提交消息。 - 修复了GCC关于
putchar
重新定义的警告。警告消息显示为 - 修复了
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
相反,后者没有编译问题)进行编译的问题。问题在于 Clang 在-shared
和-static
均不存在的情况下,为 Android 目标添加了-pie
。这种行为(是错误的)导致链接器抱怨-shared
和-pie
无法共存。
include/stdio.h:236:5: warning: conflicts with previous declaration here [-Wattributes] int putchar(int);
(变更列表91185)。 - 其他更改
-
- 将
arm_neon.h
添加到 x86 工具链中,使其现在能够模拟大约 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
选项调用 make-standalone-toolchain.sh 脚本,它等效于--toolchain=x86_64-4.9
。
- 将
Android NDK r9d (2014 年 3 月)
- 重要更改
-
- 添加了对 Clang 3.4 编译器的支持。现在,
NDK_TOOLCHAIN_VERSION=clang
选项将选择 Clang 3.4。GCC 4.6 仍然是默认编译器。 - 添加了
APP_ABI=armeabi-v7a-hard
,以及额外的 multilib 选项-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 汇编器,以及
LOCAL_ASMFLAGS
和EXPORT_ASMFLAGS
标志,用于 x86 目标。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++ 头文件/库的独立工具链。
CPLUSPLUS-SUPPORT.html
。(问题 36496) - 在
- 添加了对 Clang 3.4 编译器的支持。现在,
- 重要的错误修复
-
- 修复了 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++ 反射问题。
- 其他错误修复
-
- 头文件修复
- 为 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)
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 及更高版本修复了
- 为所有架构添加了
sys/cachectl.h
。MIPS 开发人员现在可以包含此头文件,而不是编写#ifdef __mips__
。 - 通过在
platforms/android-18/include/android/input.h
中添加__NDK_FPABI__
来修复它,该头文件用于接受或返回浮点值或双精度值的函数。 - 修复了 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 及更高版本将
scalbln
、scalblnf
和scalblnl
添加到 x86libm.so
。 - 修复了
sources/android/support/include/iconv.h
中的拼写错误。(问题 63806)
- 修复了 gabi++
std::unexpected()
,使其调用std::terminate()
,以便用户定义的std::terminate()
处理程序有机会运行。- 修复了 gabi++ 以捕获
std::nullptr
。- 修复了样本 Teapot 和 MoreTeapots
- 通过更改镜面反射变量以使用中等精度来解决 Tegra 2 和 3 芯片的问题。镜面反射功率的值现在可以小于 1.0。
- 更改了样本,以便按音量按钮可以恢复沉浸式模式并使
SYSTEM_UI_FLAG_IMMERSIVE_STICKY
无效。屏幕旋转不会触发onSystemUiVisibilityChange
,因此不会恢复沉浸式模式。
- 修复了
ndk-build
脚本,以便添加-rpath-link=$SYSROOT/usr/lib
和-rpath-link=$TARGET_OUT
,以便使用ld.bfd
来链接可执行文件。(问题 64266)- 从所有 STL 构建中删除了
-Bsymbolic
。- 通过将
SHELL
设置为环境变量而不是将其传递给python.exe
(它会忽略该设置)来修复ndk-gdb-py.cmd
。(问题 63054)- 修复了
make-standalone-toolchain.sh
脚本,以便--stl=stlport
选项会复制 gabi++ 头文件而不是对其进行符号链接;cmd.exe
和 MinGW shell 不理解 cygwin 创建的符号链接。 - 头文件修复
- 其他更改
-
- 对所有
*cmd
脚本应用了执行权限,这些脚本以前仅用于cmd.exe
shell,以防开发人员更愿意在 cygwin 中使用ndk-build.cmd
,而不是推荐的ndk-build
脚本。 - 通过在指定的目标目录不存在的情况下进行移动而不是复制来提高
make-standalone-toolchain.sh
脚本的速度。
- 对所有
Android NDK r9c (2013 年 12 月)
这是一个仅修复错误的版本。
- 重要的错误修复
-
- 修复了 GCC 4.8 ARM 中的一个问题,该问题导致栈指针恢复过早。这个问题导致帧指针无法可靠地访问栈帧中的变量。(GCC 问题 58854)
- 修复了 GCC 4.8 libstdc++ 中的一个问题,该问题导致 std::nth_element 中的错误导致生成产生随机段错误的代码。(问题 62910)
- 修复了 GCC 4.8 在 cc1/cc1plus 中使用
-fuse-ld=mcld
时出现的 ICE,因此不再出现以下错误cc1: internal compiler error: in common_handle_option, at opts.c:1774
- 修复了
-mhard-float
对__builtin
数学函数的支持。有关-mhard-float
与 STL 相关的修复的最新信息,请关注问题 61784。
- 其他错误修复
-
- 头文件修复
- 在
poll.h
中将poll
的原型更改为poll(struct pollfd *, nfds_t, int);
。 - 为 Android API 级别 12 和 19 将
utimensat
添加到libc.so
。这些库现在已包含在 Android API 级别 12 到 19 中的所有库中。 - 为 Android API 级别 19 将
futimens
引入到libc.so
中。 - 为 Android API 级别 8 及更高版本将缺少的
clock_settime()
和clock_nanosleep()
添加到time.h
。 - 在
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++ 线程本地对象。
- 在 libc.debug.malloc 在 userdebug/eng Android 平台构建中非零的情况下,避免 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 月)
- 重要更改
-
- 更新了
include/android/*h
和math.h
,适用于所有 Android API 级别(最高至 18),包括添加级别 13、15、16 和 17。有关添加的 API 的信息,请参阅更改的提交消息 68012 和 68014。(问题 47150、58528 和 38423) - 添加了对 Android API 级别 19 的支持,包括 Renderscript 绑定。
- 在现有的 armeabi-v7a ABI 中添加了对
-mhard-float
的支持。有关 Clang 的更多信息和当前限制,请参阅tests/device/hard-float/jni/Android.mk
。 - 从 GNU 编译器集合 (GCC) 4.8 迁移到 4.8.2,并添加了诊断颜色支持。要启用诊断颜色,请设置
-fdiagnostics-color=auto
、-fdiagnostics-color=always
或导出GCC_COLORS
,如下所示GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
有关更多信息,请参阅 GCC 语言无关选项。 - 添加了两个新示例以演示 OpenGL ES 3.0 功能:Teapot 和 MoreTeapots。这些示例在运行 Android 4.1(API 级别 16)及更高版本的设备上运行。
- 弃用 GCC 4.7 和 Clang 3.2 支持,它们将在下一个版本中删除。
- 更新了
- 重要的错误修复
-
- 修复了 ARM GCC 4.6
thumb2
无法生成 16 位相对跳转表的问题。(GCC 问题) - 修复了 GCC 4.8 在
g++.dg/cpp0x/lambda/lambda-defarg3.C
上的内部编译器错误 (ICE)。(更改 62770、GCC 问题) - 修复了 Windows 32 位
*-gdb.exe
可执行文件无法启动的问题。(问题 58975) - 修复了 GCC 4.8 在构建 bullet 库时的 ICE。错误消息如下
internal compiler error: verify_flow_info failed
(问题 58916、GCC 问题) - 修改了 GDB/ARM 构建以跳过
ARM.exidx
数据,以在序言代码中进行展开,并添加了一个命令 (set arm exidx-unwinding
) 来控制基于 exidx 的堆栈展开。(问题 55826) - 修复了 Clang 3.3 MIPS 编译器问题,其中 HI 和 LO 寄存器被错误地重复使用。
- 修复了 MIPS 4.7 在
dbx_reg_number
中的 ICE 问题。错误消息如下external/icu4c/i18n/decimfmt.cpp:1322:1: internal compiler error: in dbx_reg_number, at dwarf2out.c:10185
(GCC 修补程序)
- 修复了 ARM GCC 4.6
- 其他错误修复
-
- 头文件修复
- 修复了 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
,使其在 GCC 4.8 工具链中使用 c++11 模式时停止生成警告。(问题 58135、问题 58652) - 从头文件
inttypes.h
中删除了不存在的函数imaxabs
和imaxdiv
。 - 修复了
pthread_exit()
返回值和pthread_self()
的问题。(问题 60686) - 添加了缺少的
mkdtemp()
函数,该函数已存在于bionic
头文件stdlib.h
中。
- 修复了 ARM
- 修复了使用 Clang 在 Android API 级别 11 上构建
samples/gles3jni
的问题。 - 修复了 MCLinker 以允许以下选项出现多次:
-gc-sections
和--eh-frame-hdr
。 - 修复了 MCLinker 以接受
--no-warn-mismatch
选项。 - 修改了
cpu-features
选项,使其不再假设所有 VFPv4 设备都支持 IDIV。现在,此选项仅将 IDIV 添加到白名单设备中,包括 Nexus 4。(问题 57637) - 修复了
android_native_app_glue.c
错误地记录事件预调度操作错误的问题。 - 修复了
gabi++
终止和 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
。 - 修复了 Clang 3.3 在自定义
vfprintf
时出现的 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 构建,以便使用
-funwind-tables
构建所有libgcc.a
文件,以允许堆栈展开到以前被阻止的点,例如__aeabi_idiv0
。 - 在 MIPS GCC4.6/4.7/4.8 中添加了 Ingenic MXU 支持,并使用新的
-mmxu
选项。 - 扩展了 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 的头文件和库,这些库受 Android 4.3(API 级别 18)及更高版本支持。
- 将 GNU 编译器集合 (GCC) 4.8 编译器添加到 NDK 中。由于 GCC 4.6 仍然是默认选项,因此您必须明确启用此选项
- 对于
ndk-build
构建,请导出NDK_TOOLCHAIN_VERSION=4.8
或将其添加到Application.mk
中。 - 对于独立构建,请在
make-standalone-toolchain.sh
中使用--toolchain=
选项,例如
--toolchain=arm-linux-androideabi-4.8
注意:
-Wunused-local-typedefs
选项由-Wall
启用。如果您使用编译时断言(如sources/cxx-stl/stlport/stlport/stl/config/features.h
中的第 311 行),请务必添加__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 项目调试器 (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)的支持。有关更多信息,请参阅
- 重要的错误修复
-
- 修复了
android_native_app_glue
中潜在的事件处理问题。(问题 41755) - 修复了 ARM/GCC-4.7 构建以生成足够的对齐方式,用于 NEON 加载和存储指令 VST 和 VLD。(GCC 问题 57271)
- 修复了 GCC 4.4.3/4.6/4.7 在字符串文字上出现常数负索引值时的内部编译器错误 (ICE)。(问题 54623)
- 修复了 GCC 4.7 在使用对象地址进行常量初始化时的段错误。(问题 56508)
- 修复了 GCC 4.6 ARM 在使用 Boost 1.52.0 时,对于
-O
值出现的段错误。(问题 42891) - 修复了
libc.so
和libc.a
以支持wait4()
函数。(问题 19854) - 更新了 x86 libc.so 和 libc.a 文件以包括
clone()
函数。 - 修复了
LOCAL_SHORT_COMMANDS
漏洞,其中linker.list
文件为空或未使用。 - 修复了 Mac OS 上的 GCC MIPS 构建,以使用 CFI 指令,如果没有这些指令,
ld.mcld --eh-frame-hdr
会经常失败。 - 修复了 Clang 3.2 X86/MIPS 在
llvm/lib/VMCore/Value.cpp
中的内部编译器错误。(更改 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)
- 修复了
- 其他错误修复
-
- 修复了
ndk-build
脚本,以便您可以指定 Clang 的版本作为命令行选项(例如,NDK_TOOLCHAIN_VERSION=clang3.2
)。以前,仅将版本指定为环境变量才有效。 - 修复了在使用 Clang 编译器时,gabi++ 的
_Unwind_Exception
大小为 MIPS 构建目标的 24。(变更 54141) - 修复了
ndk-build
脚本,以确保在使用ndk-build clean
命令时,构建的库实际上已从包含预构建静态库的项目中删除。(变更 54461,变更 54480) - 修改了
NDK_ANALYZE=1
选项,使其不那么冗长。 - 修复了
gnu-libstdc++/Android.mk
,以便为使用向后兼容性的构建包含backward/
路径。(问题 53404) - 修复了
stlport new
有时会返回随机值的问题。 - 修复了
ndk-gdb
,使其与CPU_ABIS
的顺序匹配,而不是APP_ABIS
的顺序。(问题 54033) - 修复了 MacOSX 上的 NDK 64 位构建选择错误的编译器路径的问题。(问题 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
部分。 - 修复了 GCC 4.4.3
stlport
编译错误,该错误涉及_Unwind_Control_Block
的不一致typedef
。(问题 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)
- 修复了
- 其他更改
-
- 标头修复
- 修改了标头以使
__set_errno
成为内联函数,因为errno.h
中的__set_errno
已弃用,并且libc.so
不再导出它。 - 修改了
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
- 修复了
<inttypes.h>
中与指针相关的PRI
和SCN
宏的声明。(问题 57218) - 更改了
sys/cdefs.h
标头,以便在 API 等级小于 9 时__WCHAR_TYPE__
为 32 位,这意味着wchat_t
在所有 API 等级中均为 32 位。要恢复以前的行为,请定义_WCHAR_IS_8BIT
布尔变量。(问题 57267)
- 修改了标头以使
- 在 NDK
docs/
中添加了更多格式,并对其他文档进行了修复。 - 在构建静态库时添加了对稀疏归档技术的支持。(问题 40303)
- 更新了脚本
make-standalone-toolchain.sh
以支持stlport
库(除了gnustl
),当您指定选项--stl=stlport
时。有关更多信息,请参见STANDALONE-TOOLCHAIN.html
。 - 更新了
make-standalone-toolchain.sh
脚本,以便--llvm-version=
选项除了clang
和clang++
之外,还会创建$TOOLCHAIN_PREFIX-clang
和$TOOLCHAIN_PREFIX-clang++
脚本,以避免意外使用主机上的 clang 和 clang++ 定义。 - 添加了两个标志以重新启用上游 Clang 中的两个优化,但为了更好地与 GCC 编译的代码兼容,在 NDK 中禁用了这两个优化
- 添加了
-fcxx-missing-return-semantics
标志以重新启用 Clang 3.2+ 中的缺少返回值语义。通常,所有路径都应以返回值函数的返回语句结尾。如果不是这样,clang 会在没有返回语句的路径上插入一个未定义指令(或调试模式下的陷阱)。如果您确定代码正确,请使用此标志以允许优化器利用未定义的行为。如果您不确定,请勿使用此标志。调用者仍可能接收一个随机的错误值,但优化器不会利用它并使代码难以调试。 - 添加了
-fglobal-ctor-const-promotion
标志以重新启用将具有静态构造函数的全局变量提升为常量。使用此标志后,LLVM 的全局变量优化过程会尝试评估具有静态构造函数的全局变量并将它们提升为全局常量。虽然此优化是正确的,但它可能会导致与 GCC 编译的代码不兼容。例如,代码可能会执行const_cast
以将常量转换为可变量并对其进行修改。在 GCC 中,该变量处于读写状态,并且该代码会意外运行。在 Clang 中,常量变量位于只读内存中,并且可能会导致应用程序崩溃。
- 添加了
- 将
-mldc1-sdc1
添加到了 MIPS GCC 和 Clang 编译器。默认情况下,编译器会正确地对齐 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) - 将
android_getCpuIdArm()
和android_setCpuArm()
方法添加到了cpu-features.c
中。此添加使您可以更轻松地检索 ARM CPUID 信息。(问题 53689) - 修改了
ndk-build
以在 Clang 编译时使用 GCC 4.7 的as/ld
。注意:在 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
选项。 - 更新了构建脚本,以便在 Edison Design Group (EDG) 编译器前端重新启用
_STLP_HAS_INCLUDE_NEXT
时向您发出警告。(问题 53646) - 添加了环境变量
NDK_LIBS_OUT
以允许覆盖libraries/gdbserver
的路径,使其不再为默认的$PROJECT/libs
。有关更多信息,请参见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
链接器是默认的,如果您需要使用它,则必须显式启用它。有关更多信息,请参阅CHANGES.HTML
。 - 更新了 ndk-build,以使用拓扑排序进行模块依赖项排序,这意味着构建会自动确定在
LOCAL_STATIC_LIBRARIES
、LOCAL_WHOLE_STATIC_LIBRARIES
和LOCAL_SHARED_LIBRARIES
中指定的库的顺序。有关更多信息,请参阅CHANGES.HTML
。 (Issue 39378)
- 添加了 64 位主机工具链集(包名称后缀
- 重要的错误修复
-
- 修复了构建脚本,以便在
-O2
中构建所有工具链。先前版本的工具链没有优化,这是错误的。 - 修复了在 64 位中无条件为 MacOSX 构建 Clang/llvm 的构建脚本。
- 修复了 GCC 4.6/4.7 内部编译器错误:
gen_thumb_movhi_clobber at config/arm/arm.md:5832
。 (Issue 52732) - 修复了 GCC/ARM 4.6/4.7 无法链接使用 64 位原子内置函数的代码的构建问题。 (Issue 41297)
- 修复了 GCC 4.7 链接器 DIV 使用不匹配错误。 (Sourceware Issue)
- 修复了 GCC 4.7 内部编译器错误
build_data_member_initialization, at cp/semantics.c:5790
。 - 修复了 GCC 4.7 内部编译器错误
redirect_eh_edge_1, at tree-eh.c:2214
。 (Issue 52909) - 修复了 GCC 4.7 段错误。 (GCC Issue)
- 修复了
<chrono>
时钟分辨率,并启用了steady_clock
。 (Issue 39680) - 修复了工具链,以便为 GCC 4.7 libstdc++ 启用
_GLIBCXX_HAS_GTHREADS
。 (Issue 41770, Issue 41859) - 修复了 X86 MXX/SSE 代码由于缺少
posix_memalign
而无法链接的问题。 (Change 51872) - 修复了 GCC4.7/X86 在
i386.c
中的段错误,函数distance_non_agu_define_in_bb()
。 (Change 50383) - 修复了 GCC4.7/X86 以恢复早期的
cmov
行为。 (GCC Issue) - 修复了 libstdc++/GCC4.7 中处理
setlocale()
的 NULL 返回值。 (Issue 46718) - 修复了
ld.gold
运行时对__exidx_start
和__exidx_start_end
的未定义引用。 (Change 52134) - 修复了在使用 Eigen 库时 Clang 3.1 内部编译器错误。 (Issue 41246)
- 修复了在 C++11 模式下包含
<chrono>
时 Clang 3.1 内部编译器错误。 (Issue 39600) - 修复了在为对一致初始化的
rvalue
的方法调用生成目标代码时 Clang 3.1 内部编译器错误。 (Issue 41387) - 修复了 Clang 3.1/X86 栈重新对齐。 (Change 52154)
- 修复了在 Android 4.1.2 上调试时 GNU 调试器 (GDB) SIGILL 的问题。 (Issue 40941)
- 修复了当符号包含较长的间接文件路径时 GDB 无法设置
source:line
断点的问题。 (Issue 42448) - 修复了 MIPS PIE 可执行文件的 GDB
read_program_header
。 (Change 49592) - 修复了
STLport
在uncaught_exception()
中的段错误。 (Change 50236) - 修复了
STLport
中由于对DW_EH_PE_udata2
、DW_EH_PE_udata4
和DW_EH_PE_udata8
的未对齐访问导致的异常处理中的总线错误。 - 修复了 Gabi++ 在
nothrow new[]
运算符上的无限递归问题。 (Issue 52833) - 修复了 Gabi++ 到异常处理程序指针的错误偏移量。 (Change 53446)
- 删除了 Gabi++ 对异常对象的冗余释放 (Change 53447)
- 修复了构建脚本,以便在
- 其他错误修复
-
- 修复了 NDK 头文件
- 删除了
size_t
、ssize_t
和ptrdiff_t
的冗余定义。 - 修复了 MIPS 和 ARM
fenv.h
头文件。 - 修复了
stddef.h
,以避免重新定义offsetof
,因为它已存在于工具链中。 - 修复了
elf.h
,以包含Elf32_auxv_t
和Elf64_auxv_t
。 (Issue 38441) - 修复了
OpenSLES_AndroidConfiguration.h
头文件中的#ifdef
C++ 定义。 (Issue 53163)
- 删除了
- 修复了
STLport
,使其在内存不足错误后中止,而不是静默退出。 - 修复了系统和 Gabi++ 头文件,使其能够使用 API 级别 8 及更低版本编译。
- 修复了
cpufeatures
,使其不再解析/proc/self/auxv
。 (Issue 43055) - 修复了
ld.gold
,使其不再依赖于主机 libstdc++,并且在 Windows 平台上,不再依赖于libgcc_sjlj_1.dll
库。 - 修复了在
.vsave
中发出不一致寄存器列表并导致汇编器失败的 Clang 3.1。 (Change 49930) - 修复了 Clang 3.1,使其能够编译 libgabi++ 并通过 MIPS 构建目标的
test-stlport
测试。 (Change 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
函数。 (Issue 19851) - 修补了 GCC 4.4.3/4.6/4.7 libstdc++,以便在 C++ 11 中与 Clang 一起使用。 (Clang Issue)
- 修复了传递给
HOST_AWK
的参数中的 cygwin 路径。 - 修复了在从项目的 JNI 目录运行时
ndk-build
脚本在 Windows 中的警告。 (Issue 40192) - 修复了
ndk-build
脚本在 makefile 中LOCAL_PATH
定义包含尾部空格时无法构建的问题。 (Issue 42841)
- 修复了 NDK 头文件
- 其他更改
-
- 在 GCC/MIPS 工具链中启用了线程支持。
- 更新了 GCC 异常处理帮助程序
__cxa_begin_cleanup
和__cxa_type_match
,以具有以前在 GNU libstdc++ 中的隐藏可见性之外的默认可见性。有关更多信息,请参阅CHANGES.HTML
。 - 更新了构建脚本,以便 Gabi++ 和 STLport 静态库现在使用隐藏可见性构建,但异常处理帮助程序除外。
- 更新了构建,以便为 ARM 以 Thumb 模式构建
STLport
。 - 在 Gabi++ 中添加了对
std::set_new_handler
的支持。 (Issue 52805) - 在 GNU libstdc++ 中启用了
FUTEX
系统调用。 - 更新了
ndk-build
,使其不再将预构建的静态库复制到项目的obj/local/<abi>/
目录。 (Issue 40302) - 从 ARM
toolchains/*/setup.mk
脚本中删除了__ARM_ARCH_5*__
。 (Issue 21132) - 为 ARM 构建了额外的 GNU libstdc++ 库(以 Thumb 模式)。
- 使用 32 位 FPU 启用了 MIPS 浮点
madd/msub/nmadd/nmsub/recip/rsqrt
指令。 - 在 GCC 4.6 和 4.7 中启用了石墨循环优化器,以允许进行更多优化:
-fgraphite
、-fgraphite-identity
、-floop-block
、-floop-flatten
、-floop-interchange
、-floop-strip-mine
、-floop-parallelize-all
和-ftree-loop-linear
。 (info) - 在 Linux 和 Max OS X 32 位主机上为 Clang 3.1 启用了
polly
,它分析并优化了内存访问。 (info) - 在 linux(Clang LTO 通过 LLVMgold.so)上的 GCC 4.7、4.6、Clang 3.2 和 Clang 3.1 中启用了
-flto
。不支持 MIPS 编译器目标,因为ld.gold
不可用。 - 在 GCC 4.6/4.7 中为
ld.gold
启用了--plugin
和--plugin-opt
。 - 在 GCC 4.7 中为
ld.gold
启用了--text-reorder
。 - 使用
_GLIBCXX_USE_C99_MATH
配置了 GNU libstdc++,它取消定义了 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-gabi++.sh
和build-stlport.sh
,以便它们现在可以从 NDK 包中运行。 (Issue 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 编译器集合 (GCC) 4.7 编译器。GCC 4.6 编译器仍然是默认值,因此您必须显式启用新版本,如下所示
- 对于
ndk-build
,请导出NDK_TOOLCHAIN_VERSION=4.7
变量或将其添加到Application.mk
中。 - 对于独立构建,请将
--toolchain=
选项添加到make-standalone-toolchain.sh
中,例如--toolchain=arm-linux-androideabi-4.7
注意:此功能尚处于实验阶段。请尝试使用它并 报告任何问题。
- 对于
- 添加了通过 gabi++ 支持
stlport
异常。请注意,新的 gabi++ 依赖于dlopen
和相关代码,这意味着- 您不再能够使用
-static
选项构建静态可执行文件,也不能使用libstlport_static.a
使用APP_STL := stlport_static
。 (您仍然可以使用-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*
选项。 - 在 Android 4.1 及更高版本中,当无法通过
/proc
自动检测时,将android_setCpu()
函数添加到sources/android/cpufeatures/cpu-features.c
中供使用。 (Chromium 问题 164154)
- 在 NDK 中添加了 GNU 编译器集合 (GCC) 4.7 编译器。GCC 4.6 编译器仍然是默认值,因此您必须显式启用新版本,如下所示
- 重要的错误修复
-
- 修复了使用
ndk-build
脚本时不必要地重新构建目标文件的问题。 (问题 39810) - 修复了 NDK 8c 版本针对 Mac OS X 10.6.x 的链接器失败问题,该问题导致以下错误
dyld: lazy symbol binding failed: Symbol not found: _memmem Referenced from: ...../arm-linux-androideabi/bin/ld Expected in: /usr/lib/libSystem.B.dylib
此问题是由于在 Mac OS X 10.7 上构建造成的,这会生成与 Mac OS 10.6.x 和 NDK 不兼容的二进制文件。 - 从 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 构建中添加了缺少的
SL_IID_ANDROIDBUFFERQUEUESOURCE
选项。 (问题 40625) - 修复了针对
ANDROID_CPU_X86_FEATURE_MOVBE
功能的 x86 CPU 检测。 (问题 39317) - 修复了一个问题,该问题阻止标准模板库 (STL) 使用没有
.cpp
文件扩展名的 C++ 源代码。 - 修复了 GCC 4.6 ARM 内部编译器错误在 reload1.c:1061 处。 (问题 20862)
- 修复了 GCC 4.4.3 ARM 内部编译器错误在 emit-rtl.c:1954 处。 (问题 22336)
- 修复了 GCC 4.4.3 ARM 内部编译器错误在 postreload.c:396 处。 (问题 22345)
- 修复了 GCC 4.6/4.7 跳过 lambda 函数的问题。 (问题 35933)
- 修复了使用
- 其他错误修复
-
- NDK 头文件修复
- 修复了
__WINT_TYPE__
和wint_t
以确保它们是相同类型。 - 更正了
android/bitmap.h
中的拼写错误。 (问题 15134) - 更正了
errno.h
中的拼写错误。 - 在
sys/cdefs.h
中添加了对__STDC_VERSION__
的存在检查。 (问题 14627) - 重新组织了
byteswap.h
和dirent.h
中的头文件。 - 修复了
limits.h
以包含提供PAGE_SIZE
设置的page.h
。 (问题 39983) - 修复了
glGetAttribLocation()
和glGetUniformLocation()
的返回类型,从int
更改为GLint
。 - 修复了 x86 构建的
__BYTE_ORDER
常量。 (问题 39824)
- 修复了
- 修复了
ndk-build
脚本,以避免在 ARM 构建中将-Os
覆盖为-O2
。 - 修复了构建脚本,以允许覆盖
HOST_AWK
、HOST_SED
和HOST_MAKE
设置。 - 修复了
ld.gold
在fsck_msdos
构建中链接由 Intel C/C++ 编译器 (ICC) 构建的目标文件时出现的问题。 - 修复了 Clang 中的 ARM EHABI 支持,使其符合规范。
- 修复了 GNU 调试器 (GDB) 的问题,该问题在
solib
事件期间遍历目标链接映射时花费了过长时间。 (问题 38402) - 修复了链接共享库时缺少
libgcc.a
文件的问题。
- NDK 头文件修复
- 其他更改
-
- 将针对 ARM 的 64 位内置原子函数移植到 GCC 4.6。
- 添加了有关音频输出延迟的文档,以及其他文档和修复。
- 修复了使用 Clang 进行调试构建时出现的问题,现在非 void 函数在没有 return 语句的路径中会引发
SIGILL
信号。 - 更新了
make-standalone-toolchain.sh
以接受后缀-clang3.1
,该后缀等效于向 GCC 4.6 工具链添加--llvm-version=3.1
。 - 更新了 GCC 和 Clang 错误报告 URL,更新为:https://source.android.com/source/report-bug s.html
- 向
llvm-objdump
添加了 ARM ELF 支持。 - 抑制了 Clang 构建的将 C 输入视为 C++ 警告。
- 更新了构建,以便只构建
libiberty.a
的 32 位版本并将其放置在lib32/
中。
Android NDK r8c (2012 年 11 月)
- 重要更改
-
- 将 Clang 3.1 编译器添加到 NDK。GNU 编译器集合 (GCC) 4.6 仍然是默认值,因此您必须显式启用 Clang 编译器选项,如下所示
- 对于
ndk-build
,请导出NDK_TOOLCHAIN_VERSION=clang3.1
或将此环境变量设置添加到Application.mk
中。 - 对于独立构建,请将
--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 的默认链接器。您可以通过将LOCAL_LDFLAGS += -fuse-ld=bfd
添加到Android.mk
或通过将-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
进行链接。 - 更新了构建,以便使用 android-16 (Jelly Bean) 或更高版本的可执行文件使用
-fPIE
选项编译位置无关可执行文件 (PIE)。新的APP_PIE
选项允许您控制此行为。有关详细信息,请参阅APPLICATION-MK.html
。注意:所有高于 14 的 API 级别仍然针对
platforms/android-14
进行链接,并且没有添加新的platforms/android-N
。 - 修改了
ndk-build
以便在调整后的 API 级别大于项目AndroidManifest.xml
中的android:minSdkVersion
时提供警告。
- 修改了构建逻辑,以便在
- 更新了
cpu-features
辅助库,以包含更多针对 ARM 的功能。有关详细信息,请参阅sources/android/cpufeatures/cpu-features.h
。 - 修改了 X86 平台上的 long double,使其为 8 字节。现在此数据类型与 double 的大小相同,但仍被视为不同的类型。
- 更新了针对
APP_ABI=armeabi-v7a
的构建- 修改了此构建类型,以便将
-march=armv7-a
参数传递给链接器。此更改可确保正确链接 v7 特定的库和crt*.o
。 - 向
ndk-build
添加了-mfpu=vfpv3-d16
,而不是以前版本中使用的-mfpu=vfp
选项。
- 修改了此构建类型,以便将
- 将 Clang 3.1 编译器添加到 NDK。GNU 编译器集合 (GCC) 4.6 仍然是默认值,因此您必须显式启用 Clang 编译器选项,如下所示
- 重要的错误修复
-
- 修复了使用 root 权限运行
make-standalone-toolchain.sh
会导致独立工具链对某些用户不可访问的问题。 (问题 35279)- NDK 发布包中的所有文件和可执行文件都设置为对所有人具有读和执行权限。
- 现在在复制
libstdc++.a
时会保留其所有权/组。
- 从 Windows 预构建的
echo.exe
中删除了多余的\r
。多余的\r
导致 GNU 调试器 (GDB) 中的gdb.setup
失败,因为它错误地成为了路径的一部分。 (问题 36054) - 修复了 Windows 并行构建,该构建有时会由于
host-mkdir
实现中的时间问题而失败。 (问题 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
脚本会在添加 STLheader/lib
路径到编译之前,先在LOCAL_SRC_FILES
中搜索 C++ 文件。修改了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* 警告。 - 修复了在 GNU
stdc++
编译中同时使用-mthumb
和-march=armv7-a
时出现的问题,方法是修改了make-standalone-toolchain.sh
以在armv7-a/thumb
子目录中填充headers/libs
。 (问题 35616) - 修复了 *无法解析的 R_ARM_THM_CALL 重定位* 错误。 (问题 35342)
- 修复了
reload1.c:3633
处的内部编译器错误,该错误是由 ARM 后端在从char
符号扩展时预期错误的操作数类型导致的。 (GCC 问题 50099) - 修复了带有负移位量的内部编译器错误。 (GCC 问题)
- 修复了 ARM GCC 4.4.3/4.6
- 修复了 X86 的
-fstack-protector
,这也是ndk-build
x86 ABI 目标的默认设置。 - MIPS 特定修复
- 修复了
STLport
的字节序,方法是在编译 MIPSlibstlport_*
时将_STLP_LITTLE_ENDIAN
设置为 1。 - 修复了 GCC
__builtin_unreachable
在编译 LLVM 时出现的问题。 (GCC 问题 54369) - 回退了针对
cc1
编译过程占用 100% CPU 的修复。 (GCC 问题 50380)
- 修复了
- GNU 调试器特定修复
- 在构建时禁用了 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) - 修复了在系统上调用
dlopen()
时,动态链接器中的SIGILL
,在该系统上,/system/bin/linker
的符号被剥离,并且rtld_db_dlactivity()
被实现为Thumb
,这是由于没有保留sym_addr
的LSB
导致的。 (问题 37147)
- 在构建时禁用了 gdb-7.x 中的 Python 支持,否则 gdb-7.x 配置函数可能会选择主机上可用的任何 Python 版本,并使用对特定版本的 Python 的硬编码依赖项来构建
- 修复了使用 root 权限运行
- 其他错误修复
-
- 修复了 NDK 头文件
- 修复了从原始内核中错误删除的
arch-mips/include/asm/*
代码。 (更改 43335) - 在
linux/sysctl.h
和linux/icmp.h
中,将结构成员数据__unused
替换为__linux_unused
,以避免与sys/cdefs.h
中的#define __unused
发生冲突。 - 修复了用于带有
__BEGIN_DECLS
和__END_DECLS
的封闭 C 函数的fenv.h
。 - 删除了
malloc.h
中未实现的函数。 - 修复了 ANSI 编译器中
stdint.h
对uint64_t
的定义。 (问题 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
设置的编译和使用。 - 修复了在不构建 Windows 代码的情况下构建仅限 Linux 的 NDK 包的问题。使用以下设置来执行这种类型的构建
./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++ 包含路径,如下所示。 (问题 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
- 为 Android 可执行文件添加了新的品牌,在
.note.android.ident
部分(在crtbegin_static/dynamic.o
中定义)中使用更简单的方案,以便调试工具可以相应地采取行动。结构成员和值定义如下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 编译器集合 (GCC) 4.6 工具链和 GNU 调试器 (GDB) 7.3.x,它为 Android 4.1 (API 级别 16) 系统映像添加了调试支持。
- 重要的错误修复
-
- 修复了 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 工具链(
binutils
2.21 带gold
和 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 现在是默认的工具链。您可以在
- 更新了构建选项,默认情况下启用 Never eXecute(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 工具链(
- 其他错误修复
-
- 修复了
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
文件中将mips
添加到您的APP_ABI
定义中,以构建用于 MIPS 平台的代码。例如,以下行指示ndk-build
为三个不同的 ABI 构建您的代码APP_ABI := armeabi armeabi-v7a mips
除非您依赖于架构特定的汇编源代码,例如 ARM 汇编代码,否则您无需修改
Android.mk
文件即可构建 MIPS 机器代码。 - 您可以使用
--arch=mips
选项在调用make-standalone-toolchain.sh
时构建独立的 MIPS 工具链。有关更多详细信息,请参阅docs/STANDALONE-TOOLCHAIN.html
。
**注意:**为了确保您的应用程序仅在设备能够运行它们时才对用户可用,Google Play 会根据应用程序中包含的指令集信息对应用程序进行过滤——您无需采取任何操作即可启用过滤。此外,Android 系统本身在安装时也会检查您的应用程序,只有在应用程序提供针对设备的 CPU 架构编译的库时,才会允许继续安装。
- 添加了对 MIPS ABI 的支持,该支持允许您生成在兼容 MIPS 的 Android 设备上运行的机器代码。MIPS 的主要功能包括 MIPS 特定的工具链、系统头文件、库和调试支持。有关 MIPS 支持的更多详细信息,请参阅 NDK 包中的
- 重要的错误修复
-
- 修复了 GAbi++ 实现中的一个错别字,其中将基类对象
b
的dynamic_cast<D>(b)
结果错误地调整到与基类相反的方向。(问题 28721) - 修复了
make-standalone-toolchain.sh
无法复制libsupc++.*
的问题。
- 修复了 GAbi++ 实现中的一个错别字,其中将基类对象
- 其他错误修复
-
- 修复了
ndk-build.cmd
,以确保即使用户重新定义了SHELL
环境变量,ndk-build.cmd
也可以正常工作。在 Windows 环境中安装各种开发工具时,可能会更改该变量。
- 修复了
Android NDK r7c (2012 年 4 月)
此版本的 NDK 包含针对基于 Tegra2 的设备的重要修复,以及一些其他修复和改进
- 重要的错误修复
-
- 修复了 GNU STL armeabi-v7a 二进制文件,使其在非 NEON 设备上不会崩溃。NDK r7b 提供的文件配置不正确,导致在尝试使用某些浮点函数(例如
cosf
、sinf
、expf
)时,在基于 Tegra2 的设备和其他设备上出现崩溃。
- 修复了 GNU STL armeabi-v7a 二进制文件,使其在非 NEON 设备上不会崩溃。NDK r7b 提供的文件配置不正确,导致在尝试使用某些浮点函数(例如
- 重要更改
-
- 通过
NDK_OUT
环境变量添加了对自定义输出目录的支持。如果定义了此变量,则用于存储所有生成的中间文件,而不是$PROJECT_PATH/obj
。该变量也由ndk-gdb
识别。 - 添加了对构建包含数百甚至数千个源文件的模块的支持,方法是在
Android.mk
中将LOCAL_SHORT_COMMANDS
定义为true
。此更改强制 NDK 构建系统将大多数链接器或归档器选项放入列表文件中,作为对命令行长度限制的解决方法。有关详细信息,请参阅
docs/ANDROID-MK.html
。
- 通过
- 其他错误修复
-
- 修复了
cpufeatures
辅助库中的android_getCpuCount()
实现。在某些设备上,内核由系统动态启用,之前的实现会在第一次调用该函数时报告所有活动内核的数量,而不是所有物理可用内核的数量。
- 修复了
Android NDK r7b (2012 年 2 月)
此版本的 NDK 包含针对原生 Windows 构建、Cygwin 和许多其他改进的修复
- 重要的错误修复
-
- 更新了
sys/atomics.h
,以避免在某些基于 ARM 的多核设备上出现正确性问题。使用此版本的 NDK 重新构建您未修改的源代码,此问题应该完全消除。有关更多详细信息,请阅读docs/ANDROID-ATOMICS.html
。 - 恢复为
binutils
2.19,以修复在 NDK r7(切换到binutils
2.20.1)中出现的调试问题。 - 修复了 32 位 Linux 上的
ndk-build
。打包错误将 64 位版本的awk
可执行文件放在了 NDK r7 的prebuilt/linux-x86/bin
下。 - 修复了原生 Windows 构建(
ndk-build.cmd
)。其他构建模式不受影响。修复包括- 删除了一个无限循环/堆栈溢出错误,该错误发生在尝试从不是项目路径顶部的目录(例如,在它的任何子目录中)调用
ndk-build.cmd
时。 - 修复了自动生成的依赖项文件被忽略的问题。这意味着更新头文件不会触发包含它的源代码的重新编译。
- 修复了文件或路径中除了空格和引号以外的特殊字符处理不正确的问题。
- 删除了一个无限循环/堆栈溢出错误,该错误发生在尝试从不是项目路径顶部的目录(例如,在它的任何子目录中)调用
- 修复了独立工具链在使用
-lstdc++
(即链接到 GNUlibstdc++
C++ 运行时)时生成正确的二进制文件。如果您想链接到共享库版本,应该使用-lgnustl_shared
,或者使用-lstdc++
来链接到静态版本。有关此修复的更多详细信息,请参见
docs/STANDALONE-TOOLCHAIN.html
。 - 修复了 Cygwin 上的
gnustl_shared
。链接器抱怨找不到libsupc++.a
,即使该文件位于正确的位置。 - 修复了在不使用任何特定 C++ 运行时(通过
APP_STL
)的情况下,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
辅助库以报告三个可选的 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
不尝试使用某些 Cygwin 和/或 GNU Make 版本下$NDK/prebuilt/windows/bin
中的本机 Windows 工具。
- 当您的应用程序使用 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
文件的方法。例如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,这将以下原生功能添加到平台
- 实验性功能
- 您现在可以通过从命令行从您的项目路径调用
ndk-build.cmd
脚本,在 Windows 上无需 Cygwin 即可构建您的 NDK 源文件。该脚本接受与原始ndk-build
脚本完全相同的参数。Windows NDK 包附带了它自己的 GNU Make、Awk 和构建所需的其他工具的预构建二进制文件。您应该不需要安装任何其他东西来获得一个工作的构建系统。重要:
ndk-gdb
不适用于 Windows,因此您仍然需要 Cygwin 来调试。此功能仍处于实验阶段,因此请随时尝试它并在 公共错误数据库 或 公共论坛 上报告问题。与 NDK 一起提供的所有示例和单元测试都使用此功能成功编译。
- 重要的错误修复
-
- 如果您的
Application.mk
中没有定义APP_MODULES
,则现在默认情况下会将导入的共享库安装到目标安装位置(libs/<abi>
)。例如,如果顶级模块foo
导入模块bar
,则libfoo.so
和libbar.so
都将被复制到安装位置。以前,只有libfoo.so
被复制,除非您还在APP_MODULES
中列出bar
。如果您显式定义APP_MODULES
,则行为将保持不变。 ndk-gdb
现在可以正确地处理在它们的 MAIN 意图过滤器中具有多个类别的活动。- 静态库导入现在是真正可传递的。例如,如果顶级模块
foo
导入静态库bar
,该库又导入静态库zoo
,则libfoo.so
现在将链接到libbar.a
和libzoo.a
。
- 如果您的
- 其他更改
-
docs/NATIVE-ACTIVITY.HTML
:修复了拼写错误。原生活动的最小 API 级别应该是 9,而不是 8。docs/STABLE-APIS.html
:添加了缺少的文档,列出了 EGL 作为从 API 级别 9 开始支持的稳定 API。download-toolchain-sources.sh
:更新为从 android.googlesource.com 下载工具链源代码,这是 AOSP 服务器的新位置。- 添加了一个名为
gabi++
的新 C++ 支持运行时。有关它的更多详细信息,请参阅更新后的docs/CPLUSPLUS-SUPPORT.html
。 - 添加了一个名为
gnustl_shared
的新 C++ 支持运行时,它对应于 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 月)
此版本的 NDK 与 r6 相比没有新增功能。r6b 版本解决了 r6 版本中的以下问题
- 重要的错误修复
-
- 修复了在使用
APP_ABI="armeabi x86"
进行多架构构建时出现的构建问题。 - 修复了 NDK 发布包中预构建的 STLport 二进制文件的路径。打包脚本中的错误将它们放置在了错误的路径中。
- 修复了在使用 x86standalone 工具链的共享库中
atexit()
的使用。 - 修复了
make-standalone-toolchain.sh --arch=x86
。它以前无法将正确的 GNU libstdc++ 二进制文件复制到正确的位置。 - 修复了独立工具链链接器关于缺少
__dso_handle
符号定义和大小的警告(仅限 ARM)。 - 修复了 x86 构建中
$(SYSROOT)/usr/include
的包含顺序。有关更多信息,请参阅 错误。 - 修复了在使用 x86 独立工具链的 x86 特定系统中,
ptrdiff_t
和size_t
的定义。
- 修复了在使用
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
文件中将 x86 添加到您的APP_ABI
定义中以构建 x86 平台。例如,以下行指示ndk-build
为三个不同的 ABI 构建您的代码APP_ABI := armeabi armeabi-v7a x86
除非您依赖于基于 ARM 的汇编源代码,否则您无需修改您的
Android.mk
文件即可构建 x86 机器代码。 - 您可以使用
--toolchain=x86-4.4.3
选项在调用make-standalone-toolchain.sh
时构建独立的 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 月)
此版本的 NDK 与 r5b 相比没有新增功能。r5c 版本解决了 r5b 版本中的以下问题
- 重要的错误修复
-
ndk-build
:修复了在尝试对可调试项目执行并行构建时出现的罕见错误。- 修复了阻止
LOCAL_WHOLE_STATIC_LIBRARIES
正确使用新工具链的拼写错误,并在docs/ANDROID-MK.html
中添加了相关文档。 - 修复了与
gnustl_static
链接的代码在运行于 API 等级 8(Android 2.2)之前的平台版本上时崩溃的错误。 ndk-gdb
:修复了在调试 Android 3.0 或更新设备时导致段错误的错误。<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(build/core/build-binary.mk
中的拼写错误)会导致构建失败的错误。 - 修复了阻止编译
.s
汇编文件的错误(.S
文件可以正常工作)。
- 目标文件现在始终按它们在
Android NDK r5b (2011 年 1 月)
此版本的 NDK 与 r5 相比没有新增功能。r5b 版本解决了 r5 版本中的以下问题
- r5 二进制文件需要 glibc 2.11,但 r5b 二进制文件是使用专门针对 glibc 2.7 或更高版本的工具链生成的。Linux 工具链二进制文件现在可以在 Ubuntu 8.04 或更高版本上运行。
- 修复了 arm-linux-androideabi-4.4.3 工具链中的编译器错误。之前的二进制文件在处理带符号字符时生成了无效的 thumb 指令序列。
- 为 APP_STL 的 "gnustl_static" 值添加了缺少的文档,该值允许您链接到 GNU libstdc++ 的静态库版本。 the
- 修复了以下
ndk-build
问题- 当在 Windows 上出现编译错误时,会创建不一致的依赖文件。这会导致在源代码中修复错误后无法正常构建。
- Cygwin 特定的错误,其中使用非常短的 Android NDK 安装路径或项目路径会导致生成无效的依赖文件。这使得增量构建成为不可能。
- 拼写错误导致 cpufeatures 库无法与新的 NDK 工具链一起正常使用。
- 在 Cygwin 中的构建速度更快,因为避免了从 GNU Make 对每个源文件或目标文件调用
cygpath -m
,这会导致非常大的源代码树出现问题。如果这不能正常工作,请在您的环境中定义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
文档。
- 一般说明
-
- 增加了对本机活动的支持,允许您使用本机代码实现 Android 应用程序生命周期。
- 增加了对以下内容的本机支持
- 输入子系统(如键盘和触摸屏)
- 访问传感器数据(加速度计、指南针、陀螺仪等)。
- 事件循环 API,用于等待输入和传感器事件等。
- 窗口和表面子系统
- 基于 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 中)。如果您选择编译到这些库而不是默认的 C++ STL 实现,则也会提供 STLport(静态或共享)和 GNU libstdc++(仅静态)的预构建二进制文件。默认的 STL 实现不支持 C++ 异常和 RTTI。有关更多信息,请参阅 docs/CPLUSPLUS-SUPPORT.HTML。
- 对
cpufeatures
辅助库进行了改进,改进了对 CPU 类型的报告(某些设备以前报告的是 ARMv7 CPU,而实际上是 ARMv6)。我们建议使用此库的开发者重新构建他们的应用程序,然后上传到 Google Play,以从改进中获益。 - 添加了一个 EGL 库,允许您创建和管理 OpenGL ES 纹理和服务。
- 添加了新的示例应用程序,
native-plasma
和native-activity
,用于演示如何编写本机活动。 - 包含了许多错误修复和其他小的改进;有关更详细的更改列表,请参阅 docs/CHANGES.html。
Android NDK r4b (2010 年 6 月)
- NDK r4b 说明
-
包含了对 NDK 构建和调试脚本中的几个问题的修复 - 如果您使用的是 NDK r4,我们建议您下载 NDK r4b 构建。有关此版本中更改的详细信息,请阅读下载的 NDK 包中包含的 CHANGES.TXT 文档。
- 一般说明
-
- 通过新的
ndk-build
构建命令提供了一个简化的构建系统。 - 通过新的
ndk-gdb
命令增加了对生产设备上生成的机器代码进行轻松本机调试的支持。 - 添加了一个新的特定于 Android 的 ABI,用于基于 ARM 的 CPU 架构,
armeabi-v7a
。新的 ABI 扩展了现有的armeabi
ABI,以包含以下 CPU 指令集扩展- Thumb-2 指令
- VFP 硬件 FPU 指令 (VFPv3-D16)
- 对 ARM Advanced SIMD (NEON) GCC 内在函数和 VFPv3-D32 的可选支持。受 Verizon Droid by Motorola、Google Nexus One 等设备支持。
- 添加了一个新的
cpufeatures
静态库(带源代码),它允许您的应用程序在运行时检测主机设备的 CPU 功能。具体来说,应用程序可以检查 ARMv7-A 支持以及 VFPv3-D32 和 NEON 支持,然后根据需要提供单独的代码路径。 - 添加了一个示例应用程序,
hello-neon
,它说明了如何使用cpufeatures
库检查 CPU 功能,然后在 CPU 支持的情况下,提供使用 NEON 内在函数的优化代码路径。 - 允许您为 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 顶点和片段着色器的使用。 - 该工具链二进制文件已在此版本中使用 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
对象管理活动生命周期。
Android NDK r1 (2009 年 6 月)
最初发布为“Android 1.5 NDK,发行版 1”。
- 一般说明
-
- 包括针对 ARMv5TE 指令的编译器支持 (GCC),包括 Thumb-1 指令。
- 包括稳定本地 API 的系统头文件、文档和示例应用程序。