10

I'm using Gradle Android Experimental plugin in the following project structure:

Root Project
|-- app
|-- my-library

settings.gradle

include ':my-library', ':app'

build.gradle

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

allprojects {
    repositories {
        jcenter()
    }
}

app/build.gradle

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

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

        defaultConfig.with {
            applicationId = "a.bundle.id"
            minSdkVersion.apiLevel = 15
            targetSdkVersion.apiLevel = 23
            versionCode = 1
            versionName = "1.0"
        }
    }

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

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.0.0'
    compile project(':my-library')
}

my-library/build.gradle

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

model {
    android {
        compileSdkVersion = 'android-23'
        buildToolsVersion = '23.0.1'

        defaultConfig.with {
            minSdkVersion.apiLevel = 15
        }
    }

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

    android.ndk {
        moduleName = "xxx"
        CFlags += "-I" + "${project.buildDir}".toString() + "/../src/main/jni/libabecs/include"
        CFlags += "-std=gnu99"
    }
    android.sources {
        main {
            jni {
                source {
                    srcDir 'src/main/jni/libxxx/src'
                }
            }
        }
    }
    android.productFlavors {
        create("arm") {
            ndk.abiFilters += "armeabi"
        }
        create("arm7") {
            ndk.abiFilters += "armeabi-v7a"
        }
        create("arm8") {
            ndk.abiFilters += "arm64-v8a"
        }
        create("x86") {
            ndk.abiFilters += "x86"
        }
        create("x86-64") {
            ndk.abiFilters += "x86_64"
        }
        create("mips") {
            ndk.abiFilters += "mips"
        }
        create("mips-64") {
            ndk.abiFilters += "mips64"
        }

        create("all")
    }
}

The library project builds perfectly fine. In Android Studio, it doesn't show any error. However, when attempting to build this project with Gradle, it'll only attempt to build the app project and will practically ignore the my-library dependency, rendering class not found errors.

How to solve this?

blebleble
  • 424
  • 6
  • 13
Matoe
  • 2,742
  • 6
  • 33
  • 52

4 Answers4

5

Apparently it's a bug/feature not implemented in the build plugin.

I only found a dirty workaround to link the generated aar directly.

build.gradle (someappname)

repositories {
    flatDir {
        dirs '../my-library/build/outputs/aar'
    }
}

dependencies {
    compile project(':my-library')
    compile(name:'my-library-{flavour}', ext:'aar')
    //the rest
}
blebleble
  • 424
  • 6
  • 13
0

I faced the exact same problem, and finally found out that the path to the ndk sources in my library project was wrong, and that I had to add:

dependencies {
    project ":myHybridLib"
}

in the android.sources.main.jni of the main project.

After correcting those errors, everything compiles just fine.

Misa Lazovic
  • 2,805
  • 10
  • 32
  • 38
downstroy
  • 960
  • 1
  • 9
  • 27
0

change my_library/build.gradle to something like this :

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

model {

android {
    compileSdkVersion = 23
    buildToolsVersion = "23.0.1"

    defaultConfig.with {
        minSdkVersion.apiLevel = 15
        targetSdkVersion.apiLevel = 23
    }
}

android.ndk {
    moduleName = "FlatBuffersParser"
    cppFlags.addAll(['-std=c++11', '-fexceptions', '-Wall', '-Wno-literal-suffix'])
    cppFlags.add("-I${file("src/main/jni/flatbufferslib")}".toString())
    ldLibs.addAll(["android", "log"])
    stl = "gnustl_shared"
   }
}

for more info about structure see this project in github, it uses experimental v0.4.0 in two android module :

https://github.com/frogermcs/FlatBuffs

Hamid Zandi
  • 2,714
  • 24
  • 32
-3

Faced the same issue. I workaround it by renaming app submodule to something else. So the project structure will be

Root Project
|-- someappname
|-- my-library

settings.gradle:

include ':my-library', ':someappname'
amamede
  • 50
  • 3