无法为参数找到方法cppFlags()arguments()

时间:2017-11-18 19:33:25

标签: android c++ cmake android-ndk ndk-build

我正在尝试使用

std::function

但编译器会抛出错误

Error:(50, 10) error: no type named 'function' in namespace 'std'

我试图修改build.gradle文件

externalNativeBuild {
    ndkBuild {
        path "src/main/jni/Android.mk"
    }
    cmake {
        cppFlags "-std=c++11"
        arguments "-DANDROID_STL=gnustl_static"
        path 'src/main/jni/CMakeLists.txt'
    }
}

但它不接受path以外的参数并引发以下错误

Error:(28, 0) Could not find method arguments() for arguments [-DANDROID_STL=gnustl_static] on object of type com.android.build.gradle.internal.dsl.CmakeOptions.

请帮助我使用

std::function

更新

感谢 @Alex Cohn 我能够配置标志和参数,现在我的文件看起来像那样

apply plugin: 'com.android.library'

android {
    compileSdkVersion 25
    buildToolsVersion '26.0.2'

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags "-std=c++11"
                arguments "-DANDROID_STL=gnustl_static"
            }
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        /*   ndkBuild {
               path "src/main/jni/Android.mk"
           }*/
        cmake {
            // cppFlags "-std=c++11"
            //arguments "-DANDROID_STL=gnustl_static"
            path 'src/main/jni/CMakeLists.txt'
        }
    }
}

dependencies {
    compile 'com.android.support:support-annotations:25.0.1'
}

1 个答案:

答案 0 :(得分:20)

build.gradle 中有两个完全不同的块名为 externalNativeBuild (感谢Google)。

一个在 android 顶级块下,它指定本机构建脚本的路径, cmake ndkBuild (但不是两者都有) )。

另一个可用于从gradle指定本机构建的一些参数。此块通常是 defaultConfig 块的子项,但也可以显示 flavor (请参阅example

这些 externalNativeBuild 块也可以包含 cmake ndkBuild 子项,但只有匹配路径的子项设置(见上文)是相关的,另一个是默默忽略的。

底线,将您的块分成两部分,并将每个块放在 build.gradle 层次结构中的正确位置。