2016-07-05 97 views
3

我用C++创建了一个OpenCV项目,并希望在Android设备上运行它。我试图设置我的android项目运行本地代码没有成功。我目前面临着这样的错误:未找到(23,0)摇篮DSL方法:在Android Studio中使用OpenCV原生代码

错误“编译()”

我用原生Android开发以下GitHub的样品用的OpenCV为基础:https://github.com/jlhonora/opencv-android-sample

到目前为止,我已经做了以下尝试并获得gradle这个正确同步以太网:

updated project properties to look like this:

ndk.dir=C\:\\Android\\sdk\\ndk-bundle 
sdk.dir=C\:\\Android\\sdk 
opencv.dir=C\:\\Android\\OpenCV-android-sdk 

Imported {OpenCV_DIR}\sdk\java as a module and added it as a module dependency in the project structure settings

这是OpenCV的样本主\的build.gradle:

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

    } 
} 
allprojects { 
    repositories { 
     jcenter() 
    } 
} 
task clean(type: Delete) { 
    delete rootProject.buildDir 
} 

dependencies { 
    compile project(':OpenCVLib') 
} 

下面是该项目的的build.gradle:

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

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

    defaultConfig.with { 
     applicationId = "org.honorato.opencvsample" 
     minSdkVersion.apiLevel = 15 
     targetSdkVersion.apiLevel = 23 
     versionCode = 1 
     versionName = "1.0" 
    } 

    ndk { 
     moduleName = "native" 
     cppFlags.add("-I${file(getOpenCVDir())}".toString()) 
     cppFlags.add("-frtti") 
     cppFlags.add("-fexceptions") 
     ldLibs.addAll(["log", "opencv_java3"]) 
     stl = "gnustl_static" 
    } 
} 

android.buildTypes { 
    release { 
     // minifyEnabled = false 
     // proguardFiles = getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
    } 
} 

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") 
     ndk.ldFlags.add("-L${file('src/main/jniLibs/armeabi')}".toString()) 
    } 
    create("arm7") { 
     ndk.abiFilters.add("armeabi-v7a") 
     ndk.ldFlags.add("-L${file('src/main/jniLibs/armeabi-v7a')}".toString()) 
    } 
    create("arm8") { 
     ndk.abiFilters.add("arm64-v8a") 
     ndk.ldFlags.add("-L${file('src/main/jniLibs/arm64-v8a')}".toString()) 
    } 
    } 
} 

def getOpenCVDir() { 
    Properties properties = new Properties() 
    properties.load(new File(rootDir.absolutePath +  "/local.properties").newDataInputStream()) 
    def externalModuleDir = properties.getProperty('opencv.dir', null) 
    if (externalModuleDir == null) { 
     throw new GradleException(
       "OpenCV location not found. Define location with opencv.dir in the local.properties file!") 
    } 
    return externalModuleDir 
} 

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

最后,OpenCV库的的build.gradle:

apply plugin: 'com.android.library' 

dependencies { 
    compile fileTree(dir: 'libs', include: '*.jar') 
    compile project(':{DIR}:workspace:appcompat_v7') 
} 

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.2" 

    sourceSets { 
     main { 
      manifest.srcFile 'AndroidManifest.xml' 
      java.srcDirs = ['src'] 
      resources.srcDirs = ['src'] 
      aidl.srcDirs = ['src'] 
      renderscript.srcDirs = ['src'] 
      res.srcDirs = ['res'] 
      assets.srcDirs = ['assets'] 
     }  

     // Move the tests to tests/java, tests/res, etc... 
     instrumentTest.setRoot('tests') 

     // Move the build types to build-types/<type> 
     // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ... 
     // This moves them out of them default location under src/<type>/... which would 
     // conflict with src/ being used by the main source set. 
     // Adding new build types or product flavors should be accompanied 
     // by a similar customization. 
     debug.setRoot('build-types/debug') 
     release.setRoot('build-types/release') 
    } 
} 

如果有人可以帮助我解决这个问题,以及如何开始使用opencv进行原生android开发,我将非常感谢!

回答

2

你的问题可能来自你depenciencies标志:

compile project(':openCVLibrary300') 

当你与gradle.0.7.0阿尔法定义你的项目,可能 您的OpenCV gradle这个文件是从gradle这个稳定版本2.8或2.10编译。

gradle这个0.7.0

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

gradle这个2.10

apply plugin: 'com.android.library' 

所以很可能,你的OpenCV gradle这个文件没有正确定义。

所以你有两个选择。

如果您要以纯模式调试您的应用程序,请将您的opencv gradle文件 更改为0.7.0或将您的代码更改为gradle 2.10。

+0

我对android编程颇为陌生。你能告诉我如何将我的gradle文件更改为0.7.0吗?我认为“classpath”这一行com.android.tools.build:gradle-experimental:0.7.0-beta1'“意味着Gradle版本0.7.0被用于编译项目和所有模块。 –

相关问题