2015-07-11 26 views
0

我正在創建一個使用opencv C++代碼的項目。隨着這一刻的我只能夠找到Java可執行程序的行家中心被託管在: -關於在gradle中連接外部原生庫(opencv C++)

http://mvnrepository.com/artifact/nu.pattern/opencv/2.4.9-4 

因此,我安裝我的系統上的OpenCV並使用我的項目啓動。爲了編譯我的項目與OpenCV頭,我介紹我的build.gradle腳本如下: -

// C++ specific build configurations 

// Acquiring environment variables 
def opencvhome = System.getenv("OPENCV_HOME") 

def opencvinclude = opencvhome + "\\include" 

model { 
    components { 
     main(NativeLibrarySpec) { 
      sources { 
       cpp { 
        source { 
         srcDirs "src/main/cpp" 
         include "**/*.cpp" 
        } 
        exportedHeaders { 
         srcDirs "src/main/include", opencvinclude 
        } 
       } 
      } 
     } 
    } 
} 

這對包括必要的頭。注意opencvinclude部分是在運行Gradle構建之前將其設置爲安裝位置的環境變量。

現在我的問題是如何添加opencv的其他鏈接依賴關係?

https://docs.gradle.org/current/userguide/nativeBinaries.html 

我查閱了上面的文檔。它僅涵蓋本身是gradle項目的依賴項。但是opencv C++不是一個gradle項目。有人能幫我解決這個問題嗎?

回答

0

請看到的build.gradle該配置靜態鏈接與OpenCV的庫摘錄

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

model { 

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

    android { 
     compileSdkVersion = 22 
     buildToolsVersion = "22.0.1" 

     defaultConfig.with { 
      applicationId = "com.example.oleg.myapplication" 
      minSdkVersion.apiLevel = 18 
      targetSdkVersion.apiLevel = 22 
      versionCode = 1 
      versionName = "1.0" 
      testInstrumentationRunner = "android.support.test.runner.AndroidJUnitRunner" 
     } 

    } 

    android.ndk { 
     moduleName = "fastcvUtils" 

     //abiFilters += ["armeabi", "armeabi-v7a", "x86"] 
     abiFilters += "armeabi-v7a" 

     // Link with static OpenCV libraries: the order is important! 
     // The following order taken from OpenCV.mk 
     def opencv_modules = ["shape", "stitching", "objdetect", "superres", "videostab", "calib3d", "features2d", "highgui", "videoio", "imgcodecs", "video", "photo", "ml", "imgproc", "flann", "core", "hal"] 

     ldLibs += ["log","stdc++","dl", "z"] 

     abiFilters.each { targetAbi -> 
      println targetAbi 

      opencv_modules.each{ module -> 
       ldLibs += file(projectDir).absolutePath + "/src/main/jniLibs/" + targetAbi + "/libopencv_" + module + ".a" 
      } 
     } 

     cppFlags += "-Werror" 
     cppFlags += "--debug" 
     cppFlags += "-frtti" 
     cppFlags += "-fexceptions" 
     cppFlags += "-I/Users/Oleg/Downloads/OpenCV-android-sdk/sdk/native/jni/include" 


     ldLibs += file(projectDir).absolutePath+"/src/main/jniLibs/armeabi-v7a/libtbb.a" 

     stl = "gnustl_static" 

    } 

    android.buildTypes { 
     release { 
      isMinifyEnabled = false 
      proguardFiles += file('proguard-android.pro') 
      isJniDebuggable = true 
      isDebuggable = true 
     } 

     debug { 
      isJniDebuggable = true 
      isDebuggable = true 
     } 
    } 

    android.productFlavors { 

     create("arm") { 
      ndk.with { 

       abiFilters += "armeabi" 
       println "*** building for arm" 
      } 

     } 

     create("armv7") { 
      ndk.with { 

       abiFilters += "armeabi-v7a" 
       println "*** building for armv7" 
      } 

     } 

     create("x86") { 
      ndk.with { 
       abiFilters += "x86" 
       println "*** building for x86" 
      } 
     } 
    } 

} 

它假定.A庫被複制弗朗OpenCV的SDK到jniLibs文件夾