2016-03-29 23 views
1

Gradle-deneysel kullanarak OpenCV 3.0.0 ile yerel bir uygulama oluşturmaya çalışıyorum: 0.6.0-beta5 ve Android Studio sürümüm v2.1 Önizleme 1. Ben build.gradle dosyasında kullanacağı statik kütüphanelerini ilan etmek
Android Studio linking OpenCV static libraries
ve Building native openCV with NDK on android studio

sağlanan yaklaşımları takip ettim ve zaten 3. taraf kütüphaneleri kopyaladığınız /src/Ana sayfa/jniLibs/armeabi/3.party/:OpenCV4Android bağlantı hatası: 0.6.0-beta5

def openCVAndroidLibDir = file(project(':app').projectDir).absolutePath + "/src/main/jniLibs" 
def openCVAndroidSdkDir = "/home/jxsun/OpenCV-android-sdk/sdk/native/jni/include/opencv2" 

model { 
repositories { 
    prebuilt(org.gradle.nativeplatform.PrebuiltLibraries) { 
     libtiff { 
      binaries.withType(StaticLibraryBinary) { 
       staticLibraryFile = file("${openCVAndroidLibDir}/${targetPlatform.getName()}/3rdparty/liblibtiff.a") 
      } 
     } 
     ... 
     tbb { 
      binaries.withType(StaticLibraryBinary) { 
       staticLibraryFile = file("${openCVAndroidLibDir}/${targetPlatform.getName()}/3rdparty/libtbb.a") 
      } 
     } 

     opencv_hal { 
      headers.srcDir "${openCVAndroidSdkDir}" 
      binaries.withType(StaticLibraryBinary) { 
       staticLibraryFile = file("${openCVAndroidLibDir}/${targetPlatform.getName()}/libopencv_hal.a") 
      } 
     } 
     opencv_core { 
      headers.srcDir "${openCVAndroidSdkDir}" 
      binaries.withType(StaticLibraryBinary) { 
       staticLibraryFile = file("${openCVAndroidLibDir}/${targetPlatform.getName()}/libopencv_core.a") 
      } 
     } 
     ... 
     opencv_videostab { 
      headers.srcDir "${openCVAndroidSdkDir}" 
      binaries.withType(StaticLibraryBinary) { 
       staticLibraryFile = file("${openCVAndroidLibDir}/${targetPlatform.getName()}/libopencv_videostab.a") 
      } 
     } 
    } 
} 

android.sources { 
    main { 
     jni { 
      dependencies { 
       library "IlmImf" linkage "static" 
       ... 
       library "tbb" linkage "static" 

       library "opencv_core" linkage "static" 
       ... 
       library "opencv_videostab" linkage "static" 
       library "opencv_hal" linkage "static" 
      } 
     } 
    } 
} 

android.ndk { 
    moduleName = "test" 
    cppFlags.add("-std=c++11") 
    cppFlags.add("-fexceptions") 
    cppFlags.add("-frtti") 
    cppFlags.add("-I${file("/home/jxsun/OpenCV-android-sdk/sdk/native/jni/include")}".toString()) 
    cppFlags.add("-I${file("/home/jxsun/OpenCV-android-sdk/sdk/native/jni/include/opencv")}".toString()) 
    cppFlags.add("-I${file("/home/jxsun/OpenCV-android-sdk/sdk/native/jni/include/opencv2")}".toString()) 
    abiFilters.add("armeabi") 
    ldLibs.addAll(["android", "EGL", "GLESv2", "dl", "log", "z"]) 
    stl = "gnustl_shared" 
    platformVersion = 21 
} 

Ama ne yazık ki hala hususlar TBB hakkında tanımsız referans hataların bir sürü: Hala bile çözülemeyen libtbb.a ben önceden oluşturulmuş koyup blokları bağımlılıkları var görünüyor

/home/jxsun/StudioProjects/Test/app/src/main/jniLibs/armeabi/libopencv_core.a(parallel.cpp.o):parallel.cpp:function tbb::interface6::internal::start_for<tbb::blocked_range<int>, (anonymous namespace)::ProxyLoopBody, tbb::auto_partitioner const>::~start_for(): error: undefined reference to 'vtable for tbb::task' 

. Bu sorunu nasıl çözmeliyim?

+0

, 'ldLibs' * * vs' nativeplatform.PrebuiltLibraries' kullanarak hiçbir dezavantajları vardır. Herhangi bir oranda, ** tbb ** listedeki sonuncu olmalı, bu yüzden muhtemelen ** jni.dependencies ** sırasını değiştirerek fark yaratabilir –

+1

Teşekkür ederim @AlexCohn. Bağımlılıkların sırasını yeniden düzenledim ve şimdi çalışıyor! – jxsun

cevap

2

@AlexCohn tarafından önerilen şekilde jni.dependencies sırasını değiştirdim ve şimdi bir çekicilik gibi çalışıyor. Yani burada bazı sorunla karşı karşıya kimin benim bağlantı sırasını paylaşmak istiyorum: statik önceden oluşturulmuş kütüphaneleri ile D

android.sources { 
    main { 
     jni { 
      dependencies { 
       /* 
       * OpenCV 
       */ 
       library "opencv_flann" linkage "static" 
       library "opencv_imgproc" linkage "static" 
       library "opencv_ml" linkage "static" 
       library "opencv_photo" linkage "static" 
       library "opencv_video" linkage "static" 
       library "opencv_imgcodecs" linkage "static" 
       library "opencv_shape" linkage "static" 
       library "opencv_videoio" linkage "static" 
       library "opencv_highgui" linkage "static" 
       library "opencv_objdetect" linkage "static" 
       library "opencv_superres" linkage "static" 
       library "opencv_ts" linkage "static" 
       library "opencv_features2d" linkage "static" 
       library "opencv_calib3d" linkage "static" 
       library "opencv_stitching" linkage "static" 
       library "opencv_videostab" linkage "static" 
       library "opencv_core" linkage "static" 
       library "opencv_hal" linkage "static" 

       /* 
       * OpenCV 3rd parties 
       */ 
       library "IlmImf" linkage "static" 
       library "libjpeg" linkage "static" 
       library "libjasper" linkage "static" 
       library "libpng" linkage "static" 
       library "libwebp" linkage "static" 
       library "libtiff" linkage "static" 
       library "tbb" linkage "static" 
      } 
     } 
    } 
} 
+0

Tüm 3. parti lib'lerin opencv'lerden sonra gitmesi gerektiğine inanıyorum. Herhangi bir oranda, cevabınızı artık "kabul edebilirsiniz". –

+0

Teşekkür ederim. Cevabımı güncelledim. – jxsun