Android Studio CMake / Ninja未用于构建NDK项目

时间:2019-01-31 22:27:39

标签: android android-studio cmake android-ndk ninja

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

~/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja --version
1.8.2

在尝试构建项目时遇到“错误配置”。这是构建输出:

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 : 

它不见了:

-DCMAKE_MAKE_PROGRAM=/Users/ssk/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja

错误:

 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中的代码段:

 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"
        }
    }

如何解决?

1 个答案:

答案 0 :(得分:2)

从Android Studio SDK管理器安装/更新CMake

Install/Update CMake From Android Studio SDK Manager

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


以下内容不好。

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自动确定,请参见以下how ANDROID_PLATFORM works的官方文档:

  

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

     
      
  1. 如果ABI的平台版本等于minSdkVersion,则CMake将使用该版本。   否则,
  2.   
  3. 如果ABI的平台版本低于minSdkVersion,则CMake将使用这些平台中的最高版本。这是一个合理的选择,因为缺少平台版本通常意味着自从先前的可用版本以来,本机平台API一直没有更改。
  4.   
  5. 否则,CMake将使用高于minSdkVersion的下一个可用平台版本。
  6.   

而且-DANDROID_ABI=armeabi-v7a也不是很好。您不应在此处定义此参数。 CMake将根据您的abiFilter自动迭代所有ABI 。如果您只想构建armeabi-v7a,则可以使用abiFilter进行指定,例如

externalNativeBuild {
    cmake {
        abiFilters 'armeabi-v7a', 'arm64-v8a'
    }
}

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

cppFlags "-std=c++11 -frtti -fexceptions"

请确保您已正确配置ANDROID_NDK路径,因为根据您的问题,您设置了两个版本的NDK,一个是-DANDROID_NDK=/Users/ssk/android-ndk-r17c/,另一个是{ {1}}。从-DANDROID_NDK=/Users/ssk/Library/Android/sdk/ndk-bundle配置NDK路径:

local.properties
  

-GAndroid Gradle-Ninja的修复程序是什么?

ndk.dir=/Users/ssk/Library/Android/sdk/ndk-bundle sdk.dir=/Users/ssk/Library/Android/sdk 下方添加到arguments的配置中:

cmake