首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >/Ninja不用于构建NDK项目

/Ninja不用于构建NDK项目
EN

Stack Overflow用户
提问于 2019-01-31 22:27:38
回答 1查看 10.9K关注 0票数 7

我通过Android的SDK工具安装了以下CMAKE和Ninja:

代码语言:javascript
复制
~/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja --version
1.8.2

我在试图构建我的项目时遇到了“错误配置”。以下是构建输出:

代码语言:javascript
复制
Executable : /Users/ssk/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake
arguments : 
-H/Users/ssk/MyProject
-B/Users/ssk/MyProject/.externalNativeBuild/cmake/debug/armeabi-v7a
-DANDROID_ABI=armeabi-v7a
-DANDROID_PLATFORM=android-16
-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Users/ssk/MyProject/build/intermediates/cmake/debug/obj/armeabi-v7a
-DCMAKE_BUILD_TYPE=Debug
-DANDROID_NDK=/Users/ssk/Library/Android/sdk/ndk-bundle
-DCMAKE_CXX_FLAGS=-std=c++11
-DCMAKE_SYSTEM_NAME=Android
-DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a
-DCMAKE_SYSTEM_VERSION=16
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON
-DCMAKE_ANDROID_NDK=/Users/ssk/Library/Android/sdk/ndk-bundle
-DCMAKE_TOOLCHAIN_FILE=/Users/ssk/Library/Android/sdk/ndk-bundle/build/cmake/android.toolchain.cmake
-G Ninja
-DANDROID_STL=gnustl_statics
-DANDROID_CPP_FEATURES=rtti exception
-DANDROID_TOOLCHAIN=gcc
-DANDROID_NDK=/Users/ssk/android-ndk-r17c/
jvmArgs : 

它不见了:

代码语言:javascript
复制
-DCMAKE_MAKE_PROGRAM=/Users/ssk/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja

错误:

代码语言:javascript
复制
 CMake was unable to find a build program corresponding to "Ninja".  CMAKE_MAKE_PROGRAM is not set.  You probably need to select a different build tool

只有当我切换到CMake版本(比如3.6.3155560 )时,它才能工作。否则,我必须从brew或macports安装忍者。

下面是我的build.gradle的片段:

代码语言:javascript
复制
 externalNativeBuild {
        cmake {
            // Linker flags and Visibility options keeps the size of the library small
            cppFlags "-std=c++11"
            arguments "-DANDROID_STL=gnustl_static",
                      "-DANDROID_CPP_FEATURES=rtti exceptions",
                      "-DANDROID_TOOLCHAIN=gcc"
        }
    }

怎么修呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-01 05:25:08

从管理器安装/更新CMake

如果存在忍者,请从sdk根目录检查您的CMake。

下面是不好的。

代码语言:javascript
复制
cmake {
    cppFlags "-std=c++11"
    arguments "-DANDROID_ABI=armeabi-v7a",
                "-DANDROID_PLATFORM=android-16",
                "-DANDROID_STL=gnustl_static",
                "-DANDROID_CPP_FEATURES=rtti exceptions",
                "-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=libs"
}

由于ANDROID_PLATFORM应该由Android外部本地构建系统根据minSdkVersion自动确定,请参见 works的正式文档:

与其直接更改此标志,不如在模块级minSdkVersion文件的defaultConfigproductFlavors块中设置build.gradle属性。这将确保您的库只被安装在运行适当版本Android的设备上的应用程序使用。然后,CMake工具链使用以下逻辑为您构建的ABI选择最佳平台版本:

  1. 如果存在相当于minSdkVersion的ABI平台版本,CMake将使用该版本。否则,
  2. 如果存在低于minSdkVersion的平台版本,则CMake使用这些平台版本中的最高版本。这是一个合理的选择,因为缺少的平台版本通常意味着自上一个可用版本以来对本机平台API没有任何更改。
  3. 否则,CMake将使用比minSdkVersion更高的下一个可用平台版本。

而且,-DANDROID_ABI=armeabi-v7a也不是很好。您不应该在这里定义这个参数。CMake将根据您的abiFilters自动迭代所有ABIs。如果您只想构建armeabi-v7a,可以使用abiFilter来指定它。

代码语言:javascript
复制
externalNativeBuild {
    cmake {
        abiFilters 'armeabi-v7a', 'arm64-v8a'
    }
}

另外,rttiexceptionscppFlags,下面应该是设置这两个标志的正确方法。

代码语言:javascript
复制
cppFlags "-std=c++11 -frtti -fexceptions"

确保您已经正确配置了ANDROID_NDK路径,因为根据您的问题,您有两个版本的NDK,一个是-DANDROID_NDK=/Users/ssk/android-ndk-r17c/,另一个是-DANDROID_NDK=/Users/ssk/Library/Android/sdk/ndk-bundle。从local.properties配置NDK路径

代码语言:javascript
复制
ndk.dir=/Users/ssk/Library/Android/sdk/ndk-bundle
sdk.dir=/Users/ssk/Library/Android/sdk

-GAndroid级-忍者的修复方法是什么?

将下面的arguments添加到cmake配置:

代码语言:javascript
复制
externalNativeBuild { 
    cmake { 
        ...
        version "3.10.2"
        arguments "-GAndroid Gradle - Ninja"
    } 
} 
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54470140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档