2016-03-29 8 views
1

OpenCV 3.0.0でネイティブアプリケーションを作成しようとしています:gradle-experimental:0.6.0-beta5、Android Studioバージョンはv2.1プレビュー1.私はbuild.gradleファイルで使用する静的ライブラリを宣言する
Android Studio linking OpenCV static libraries
Building native openCV with NDK on android studio

で提供アプローチを踏襲している、と私はすでににサードパーティのライブラリをコピーした/SRC /メイン/ jniLibs/Armeabi/3rdparty/Gradle-ExperimentalでOpenCV4Androidリンクエラーが発生しました:

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 
} 

しかし残念ながら、私はまだTBBについて未定義の参照エラーの多くを得る:

/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' 

libtbb.aはまだ私が事前に作成し、依存関係のブロックに入れても解決できないようです。 この問題をどのように解決すればよいですか?

+0

、 'ldLibs' * * VS' nativeplatform.PrebuiltLibraries'を使用して何の欠点はありません。いずれにせよ、** tbb **はリストの最後になければならないので、おそらく** jni.dependencies **の順番を変更すると違いが生まれます –

+1

ありがとう@AlexCohn。私は依存関係の順序を並べ替え、今すぐ動作します! – jxsun

答えて

2

@AlexCohnが提案するように、のjni.dependenciesの順番を変更しました。これは今の魅力のように機能します。だから私はここにいくつかの問題に直面するかもしれない人のための私のリンク順序を共有したいと思います:静的ビルド済みのライブラリと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

私は、すべてのサードパーティ製のライブラリはopencvのものを追い越すべきだと考えます。とにかく、あなたは今あなたの答えを "受け入れる"ことができます。 –

+0

ありがとうございます。私は私の答えを更新しました。 – jxsun