介绍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,Op​​enSLES等的现代标题。这样可以在你具有较旧的目标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插件

快来了!沿着这里

自定义构建系统?

我们已经覆盖了你 有关在构建系统中添加对统一标题的支持的说明,请参见此处

有关统一标题的其他信息,请参阅我们的文档跟踪错误。如果你期待将来的版本,最新版本的文档在主分支中

results matching ""

    No results matching ""