介绍Android NDK工具r14版
原标题:Introducing Android Native Development Kit r14
链接:https://android-developers.googleblog.com/2017/03/introducing-android-native-development.html
作者:Dan Albert (Android NDK科技负责人)
翻译:arjinmc
最新版本的Android Native Development Kit(NDK),Android NDK r14,现已可供下载。它也可以通过Android Studio在SDK管理器中使用。
那么r14中更新了什么?完整的更新日志可以在这里看到,但亮点包括以下内容:
- 将所有平台标头更新为统一标题(下面详细介绍)
- LTO与Clang现在在Darwin和Linux上工作
- libc ++已更新。现在,你可以使用thread_local 进行静态与非平凡的析构函数(仅限Clang)
- RenderScript回来了
统一标题
我们已经完全重做了如何在NDK中发送平台头文件。而不是为每个目标API级别提供一组标题,现在有一组头文件。每个Android平台的API可用性通过#if ANDROID_API> = ANDROID_API_FOO预处理程序指令在这些标头中得到保护。
先前的方法依赖于定期捕获的平台头部的快照。这意味着任何时候,我们修复了一个仅限标题的错误,该修复程序仅在最新版本中可用,除了偶尔的后端。无论NDK API级别如何,现在都可以使用错误修复。
除了错误修复之外,这也意味着你可以在每个目标版本上访问现代的Linux UAPI标头。这对移植现有Linux代码(尤其是低级别的东西)的人来说,这一点很重要。要记住的重要事项:只因为你的标题并不意味着你正在使用足够新内核的设备上运行,以支持每个系统调用。与系统调用一样,ENOSYS是一种可能性。
除了Linux标题之外,你还可以使用OpenGL,OpenSLES等的现代标题。这样可以在你具有较旧的目标API级别时更有条件地使用新的API。即使在KitKat之前该库不可用,冰淇淋三明治也可以使用GLES3标题。你仍然需要通过dlopen/dlsym使用所有的API调用,至少可以访问调用这些函数所需的所有常量和#define。
请注意,我们将使用r16从NDK中删除旧标头,因此,你越早发现错误,转换过程就会越平滑。
注意事项
API #ifdef的守卫不存在于OpenGL中的第三方头像。在这种情况下,如果你使用API在目标API级别不可用,你将收到链接时间错误(未定义的引用)而不是编译时错误。
使用GCC的独立工具链不支持开箱即用(也不会)。要使用GCC,请在编译时传递-DANDROID_API = $ API。
在你的构建中启用统一标头
为了简化从传统头文件到统一标题的转换,我们默认情况下尚未启用新的标头,尽管我们将在r15中执行此操作。你如何选择统一标题将取决于你的构建系统。
NDK建造
在你的Application.mk中:
APP_UNIFIED_HEADERS := true
您还可以从命令行设置此属性,如下所示:
$ ndk-build APP_UNIFIED_HEADERS=true
如果您正在使用带有externalNativeBuild的 Gradle的ndk-build ,请在build.gradle中指定以下配置设置:
android {
...
defaultConfig {
...
externalNativeBuild {
ndkBuild {
...
arguments "APP_UNIFIED_HEADERS=true"
}
}
}
}
CMake的
配置构建时,请设置ANDROID_UNIFIED_HEADERS = ON。这通常采用cmake -DANDROID_UNIFIED_HEADERS = ON $OTHER_ARGS调用CMake的形式。
如果您通过Gradle与externalNativeBuild一起使用CMake ,则可以使用:
android {
...
defaultConfig {
...
externalNativeBuild {
cmake {
...
arguments "-DANDROID_UNIFIED_HEADERS=ON"
}
}
}
}
独立工具链
创建独立工具链时,传递 --unified-headers。请注意,传统脚本make-standalone-toolchain.sh目前不支持此选项,但仅在make_standalone_toolchain.py中。
实验级Gradle插件
快来了!沿着这里。
自定义构建系统?
我们已经覆盖了你 有关在构建系统中添加对统一标题的支持的说明,请参见此处。