【问题标题】:SIPdroid Android Studio ndk integration errorSIPdroid Android Studio ndk集成错误
【发布时间】:2016-01-06 07:00:42
【问题描述】:

我目前正在使用 Android Studio 2.0 预览版 4。我遵循了来自 tools.android.com 的指南并测试了来自 github 的 NDK samples。示例工作顺利,但是当我在 SIPdroid 项目上实现它时,当我重建项目时它会抛出此错误:

错误:(78, 1) 配置项目 ':app' 时出现问题。 执行模型规则时抛出异常:model.android 无法为类设置只读属性:minSdkVersion:com.android.build.gradle.managed.ProductFlavor_Impl

当我尝试使用 gradle 项目同步时,它会出现此错误:

错误:无法加载类“com.android.build.gradle.managed.ProductFlavor_Impl”。 此意外错误的可能原因包括:

  • 您正在使用 JDK 版本'java 版本“1.7.0_79”'。 JDK 1.7 的某些版本(例如 1.7.0_10)可能会导致 Gradle 中的类加载错误。 请更新到较新的版本(例如 1.7.0_67)。 打开 JDK 设置
  • Gradle 的依赖缓存可能已损坏(这有时会在网络连接超时后发生。) 重新下载依赖并同步项目(需要网络)
  • Gradle 构建过程(守护程序)的状态可能已损坏。停止所有 Gradle 守护程序可能会解决此问题。 停止 Gradle 构建过程(需要重新启动)
  • 您的项目可能正在使用与项目中的其他插件或项目请求的 Gradle 版本不兼容的第三方插件。
在 Gradle 进程损坏的情况下,也可以尝试关闭 IDE,然后杀死所有 Java 进程。

Android 项目结构现在看起来像这样。以前 jni 文件夹与 java 文件夹是分开的。

这是我的配置:

SIPdroid/app/build.gradle

apply plugin: 'com.android.model.application'

model {
    android {
        compileSdkVersion = 23
        buildToolsVersion = "23.0.2"

        defaultConfig.with {
            applicationId = "com.test.sipdroid"
            minSdkVersion = 15
            targetSdkVersion = 23
            versionCode = 1
            versionName = "1.0"
        }
    }

    compileOptions.with {
        sourceCompatibility = JavaVersion.VERSION_1_7
        targetCompatibility = JavaVersion.VERSION_1_7
    }

    /*
     * native build settings
     */
    android.ndk {
        moduleName = "SIPdroid"
        /*
         * Other ndk flags configurable here are
         * cppFlags.add("-fno-rtti")
         * cppFlags.add("-fno-exceptions")
         * ldLibs.addAll(["android", "log"])
         * stl       = "system"
         */
    }

    android.sources {
        main.java {
            source {
                srcDir 'src'
            }
        }
        main.jni {
            source {
                srcDirs = []
            }
        }
        main.jniLibs {
            source {
                srcDirs = ['src/main/libs']
            }
        }
    }

    android.buildTypes {
        release {
            minifyEnabled = false
            proguardFiles.add(file('proguard-rules.txt'))
        }
    }

    android.productFlavors {
        // for detailed abiFilter descriptions, refer to "Supported ABIs" @
        // https://developer.android.com/ndk/guides/abis.html#sa
        create("arm") {
            ndk.abiFilters.add("armeabi")
        }
        create("arm7") {
            ndk.abiFilters.add("armeabi-v7a")
        }
        create("arm8") {
            ndk.abiFilters.add("arm64-v8a")
        }
        create("x86") {
            ndk.abiFilters.add("x86")
        }
        create("x86-64") {
            ndk.abiFilters.add("x86_64")
        }
        create("mips") {
            ndk.abiFilters.add("mips")
        }
        create("mips-64") {
            ndk.abiFilters.add("mips64")
        }
        // To include all cpu architectures, leaves abiFilters empty
        create("all")
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'
}

SIPdroid/build.gradle

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

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle-experimental:0.4.0'
//        classpath 'com.android.tools.build:gradle:1.3.1'

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

allprojects {
    repositories {
        jcenter()
    }
}

SIPdroid/gradle-wrapper.properties

#Mon Jan 04 16:06:26 PHT 2016
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip

SIPdroid/local.properties

ndk.dir=/path/Android/sdk/ndk-bundle
sdk.dir=/path/Android/sdk

【问题讨论】:

    标签: android android-studio gradle android-ndk sipdroid


    【解决方案1】:

    我刚刚解决了我的问题,方法是将其添加到我的原始 app/build.gradle 文件中,而不使用实验性 gradle 构建 ('com.android.tools.build:gradle-experimental:0.4.0'),如谷歌示例。

    这个解决方案终于解决了NDKBuild Failure的问题。此附加脚本使用 ndkBuild 构建您的 jni 文件。

    app/build.gradle

    sourceSets.main {
            jniLibs.srcDir 'src/main/libs' // use the jni .so compiled from the manual ndk-build command
            jni.srcDirs = [] //disable automatic ndk-build call
        }
    
        task ndkBuild(type: Exec) {
    //        commandLine 'ndk-build', '-C', file('src/main/jni').absolutePath <-- Not working
            commandLine '/home/user/Android/sdk/ndk-bundle/ndk-build', '-C', file('src/main/jni').absolutePath
        }
    
        tasks.withType(JavaCompile) {
            compileTask -> compileTask.dependsOn ndkBuild
        }
    

    SIPdroid/build.gradle

    dependencies {
            classpath 'com.android.tools.build:gradle:1.2.3'
    }
    

    你还需要在 app/src/main 下有一个空的 libs 文件夹。我的错误是我将 /jni 文件夹重命名为 /libs。运行构建后,它会将你的 jni 编译到 /libs 文件夹到 .so 文件

    您的 Android 项目结构视图中的 jniLibs 将如下所示。这来自您的 app/src/main/libs,如 build.gradle 脚本中所示

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2015-11-27
      • 2015-11-02
      • 2016-08-01
      • 1970-01-01
      • 2015-05-10
      • 1970-01-01
      • 2018-04-10
      • 2016-01-19
      • 1970-01-01
      相关资源
      最近更新 更多