无法为

时间:2018-03-09 12:34:32

标签: gradle android-ndk

我正在从一个较旧的Gradle版本移动一个项目,它在当前工作正常并且刚刚遇到一个又一个问题。大多数我用谷歌搜索,但刚刚在这一个墙上撞墙。

错误:(20,0)无法为com.android.build.gradle.internal.dsl.NdkOptions类型的对象获取未知属性'cppFlags'。

下面是ndk

的cppFlag.add部分

我有一种感觉它与NDK或CMake或类似的东西有关但是我很难过,而不是一个Gradle家伙。 我没有发布应用程序gradle只是因为它相当大,但可以在需要时执行。

非常感谢对此有所帮助。 感谢

模块Gradle

apply plugin: 'com.android.library'

def basedir = projectDir.absolutePath

android {
    compileSdkVersion=26
    buildToolsVersion="27.0.3"

    defaultConfig {
        minSdkVersion 26
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"

        ndk {
            moduleName "biocore"
                stl = "gnustl_shared"

                cppFlags.add("-std=c++11")
                cppFlags.add("-frtti")
                cppFlags.add("-fexceptions")

                cppFlags.add("-I${basedir}/src/main/headers".toString())
                cppFlags.add("-iquote${basedir}/src/main/jni".toString())

                ldLibs.addAll(["android","log","atomic","z"])
        }
    }

}

android.productFlavors {
    create("armv7") {
        ndk.abiFilters.add("armeabi-v7a")
        String libsDir = "${basedir}/src/main/jniLibs/armeabi-v7a/"
        ndk.ldLibs.addAll([
                libsDir + "libopencv_legacy.a",
                libsDir + "libopencv_calib3d.a",
                libsDir + "libopencv_features2d.a",
                libsDir + "libopencv_flann.a",
                libsDir + "libopencv_imgproc.a",
                libsDir + "libopencv_highgui.a",
                libsDir + "libopencv_contrib.a",
                libsDir + "libopencv_objdetect.a",
                libsDir + "libopencv_core.a",
                libsDir + "libtbb.a",
                libsDir + "liblibtiff.a",
                libsDir + "liblibpng.a",
                libsDir + "liblibjpeg.a",
                libsDir + "liblibjasper.a",
                libsDir + "libIlmImf.a",
        ])
    }
}

android.compileOptions.with {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
}

android.dependencies {
    compile 'com.android.support:appcompat-v7:26.1.0'
}

Project Gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
repositories {
    jcenter()
    google()
    maven { url "https://maven.google.com" }
}
dependencies {
    classpath 'com.android.tools.build:gradle:3.0.1'
 // classpath 'com.android.tools.build:gradle-experimental:0.11.1'


    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
 }
}

allprojects {
repositories {
    jcenter()
    maven {
        url "https://maven.google.com"
    }
    google()
 }
}

更新 根据迈克尔斯的建议(如果我理解正确的话),我修改如下;

  ndk {
           moduleName "biocore"
           stl="gnustl_shared"

       }
        externalNativeBuild{
            cmake {
                cppFlags.add("-std=c++11")
                cppFlags.add("-frtti")
                cppFlags.add("-fexceptions")

                cppFlags.add("-I${basedir}/src/main/headers".toString())
                cppFlags.add("-iquote${basedir}/src/main/jni".toString())

               ldLibs.addAll(["android", "log", "atomic", "z"])
            }
        }
    }
}

现在我看到了类似的问题 - 未知属性'ldLibs' 我尝试将该行移动到ndk {block但得到相同的消息。 如果我将它注释掉(ldLids.addAll),那么它会在ndk.abiFilters的productFlavors块中出现同样的消息 - 未知属性

2 个答案:

答案 0 :(得分:0)

在@Michael的帮助下,我把它排序了。

apply plugin: 'com.android.library'

android {
compileSdkVersion 27

defaultConfig {
    minSdkVersion 21
    targetSdkVersion 27
    versionCode 1
    versionName "1.0"

    externalNativeBuild {
        cmake {
            cppFlags "-fexceptions"
        }
    }
}

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        ndk {
            abiFilters "armeabi-v7a"
        }
    }
    debug {
        ndk {
            abiFilters "armeabi-v7a"
        }
    }
}

externalNativeBuild {
    cmake {
        path "CMakeLists.txt"
    }
}

}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
}

答案 1 :(得分:0)

您开始使用 experimental gradle插件。这是为了在gradle中为C ++库提供构建设置。这个插件is facing end-of-life(请参阅链接了解详细的借口)。目前,Google提供了external native build tools,他们建议 cmake 而不是 ndkBuild

这意味着所有标志和配置都应该在 CMakeLists.txt 中处理,但very few parameters除外,它可以微调不同风格的构建或gradle配置。