使用 Cmake 和 Ninja 限制 ndkBuild 的 CPU 内核数

bio*_*007 4 android cmake ninja ndk-build

之前,我使用ndkBuld在Android上我构建本地代码的时候能够将参数传递到化妆定义要使用多个CPU内核。如果我想使用 4 个内核,我可以添加这样的东西

externalNativeBuild {
    ndkBuild {
        arguments "-j4", "APP_SHORT_COMMANDS=true"
        abiFilters "armeabi-v7a"
    }
}
Run Code Online (Sandbox Code Playgroud)

有人可以建议我如何用 Cmake 和 Ninja 做类似的事情吗?cmake 配置是否有一些等效参数?

externalNativeBuild {
    cmake {
        arguments "-DANDROID_STL=c++_static"
        abiFilters getAbis()
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢。

J-C*_*phe 6

控制忍者并行性

Ninja 也支持相同的参数:

$ ninja --help
usage: ninja [options] [targets...]

[...]

options:
  [...]

  -j N     run N jobs in parallel [default=10, derived from CPUs available]

  [...]
Run Code Online (Sandbox Code Playgroud)

控制忍者并行区分compilelink工作

现在,如果你想要更多的粒度。例如,如果您想限制同时link jobs、 或compile jobs或两者的数量。

从 CMake 3.11 开始,现在可以限制compile和/或link作业的数量。

然后,您可以使用以下选项配置您的项目:

-DCMAKE_JOB_POOL_COMPILE:STRING=compile
-DCMAKE_JOB_POOL_LINK:STRING=link
'-DCMAKE_JOB_POOLS:STRING=compile=5;link=2'
Run Code Online (Sandbox Code Playgroud)

现在,如果您的项目最终产生了其他自己正在使用 ninja 构建项目的子进程,您将必须:

  • 使用包含 Job Server 支持的 ninja 分支,就像在make. 相关的 GitHub 版本中也提供了二进制文件。见https://github.com/kitware/ninja#readme

  • 确保子项目也配置了相同的-DCMAKE_JOB_选项

在 externalNativeBuild 的上下文中

这意味着你可以尝试这样的事情:

externalNativeBuild {
    cmake {
        arguments "-DANDROID_STL=c++_static -DCMAKE_JOB_POOL_COMPILE:STRING=compile -DCMAKE_JOB_POOL_LINK:STRING=link '-DCMAKE_JOB_POOLS:STRING=compile=5;link=2'"
        abiFilters getAbis()
    }
}
Run Code Online (Sandbox Code Playgroud)


bio*_*007 0

好吧,这似乎是 NDK 中的一个错误/缺少的功能。我和一些“NDK Google 员工”交谈过,他们也无法帮助我。希望后续版本的 NDK/AS 能够支持它。

以下是您可以跟踪进度的问题:

https://github.com/android-ndk/ndk/issues/983

https://issuetracker.google.com/issues/137878831