Search code examples
androidandroid-studioandroid-ndkoculusgear-vr

Oculus Mobile SDK sample project error when I try to build :compileReleaseNdk:


I encountered some errors below when I try to build sample project of oculus mobile sdk.


Error:FAILURE: Build failed with an exception.

  • Where: Build file '~/oculus_sdk/ovr_sdk_mobile_1.0.0.1/VrSamples/Native/CinemaSDK/Projects/Android/build.gradle' line: 28

  • What went wrong: A problem occurred configuring project ':VrSamples:Native:CinemaSDK:Projects:Android'.

    Could not get unknown property 'compileReleaseNdk' for project ':VrSamples:Native:CinemaSDK:Projects:Android' of type org.gradle.api.Project.

  • Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.


Someone can fix this problem?

My dev environment is below.

  • Android studio 2.2
  • Android NDK : android-ndk-r12b
  • Oculus Mobile SDK : 1.0.0.1
  • OSX 10.11.6

And gradle file content that mentioned in Debug message was like this...

apply plugin: 'com.android.application'

dependencies {
    compile name: 'VrAppFramework', ext: 'aar'
    compile project(':VrAppSupport:SystemUtils:Projects:AndroidPrebuilt')
    compile project(':VrAppSupport:VrGUI:Projects:AndroidPrebuilt')
    compile project(':VrAppSupport:VrLocale:Projects:AndroidPrebuilt')
    compile project(':VrAppSupport:VrSound:Projects:AndroidPrebuilt')
}

android {
    compileSdkVersion 19
    buildToolsVersion '24.0.1'

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            jniLibs.srcDir 'libs'
            res.srcDirs = ['res']
            assets.srcDirs = ['../../assets']
        }
    }
}

project.afterEvaluate {
  compileDebugNdk.dependsOn   'NDKBuildDebug'
  compileReleaseNdk.dependsOn 'NDKBuildRelease'
  clean.dependsOn             'NDKBuildClean'
}

android.applicationVariants.all { variant ->
      variant.outputs.each { output ->
            def alignedOutputFile = output.outputFile
            def unalignedOutputFile = output.packageApplication.outputFile
            def buildTypeName = variant.buildType.name

            def finalFileName = rootProject.name + "-" + buildTypeName + ".apk"
            def unAlignedFileName = rootProject.name + "-" + buildTypeName + "-unsigned" + ".apk"

            output.packageApplication.outputFile = 
                    new File(unalignedOutputFile.parent, unAlignedFileName)

            if (output.zipAlign) {
                output.outputFile = 
                    new File(alignedOutputFile.parent, finalFileName)
            }
    }
}

Solution

  • I've already found a nice answer on similar issue: execution failed for task ':app:compileDebugNdk' failed to run this command ndk-build.cmd

    Error:Execution failed for task ':app:compileDebugNdk'.

    means that the gradle android plugin is trying to call ndk-build itself to compile your sources. You should get more details than the error code in your log window.

    Anyway, currently it does this using an auto-generated Makefile and ignores yours, which can't work since you need to integrate ffmpeg.

    To overcome this, you should disable the plugin's automatic ndk integration and make it use the standard libs location to get your .so files:

    sourceSets.main {
        jniLibs.srcDir 'src/main/libs'
        jni.srcDirs = [] //disable automatic ndk-build call
    }
    

    from there you can call ndk-build yourself, or make gradle call it for you:

    import org.apache.tools.ant.taskdefs.condition.Os
    
    // call regular ndk-build(.cmd) script from app directory
    task ndkBuild(type: Exec) {
        if (Os.isFamily(Os.FAMILY_WINDOWS)) {
            commandLine 'ndk-build.cmd', '-C', file('src/main').absolutePath
        } else {
            commandLine 'ndk-build', '-C', file('src/main').absolutePath
        }
    }
    
    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn ndkBuild
    }
    

    For more information on why all this, you can check this gist and my blog post.

    All you need to do is to disable the ndk-build by adding below property in the build.gradle file.

    sourceSets.main {
            jniLibs.srcDir 'src/main/libs'
            jni.srcDirs = [] //disable automatic ndk-build call
        }
    

    or remove the second line: jni.srcDirs = [...]

    Hope it will help