android - Gradle-Experimental :0. 6.0-beta5 的 OpenCV4Android 链接错误

标签 android opencv android-ndk android-gradle-plugin

我正在尝试使用 gradle-experimental:0.6.0-beta5 使用 OpenCV 3.0.0 构建 native 应用程序,我的 Android Studio 版本是 v2.1 Preview 1。我已按照
Android Studio linking OpenCV static libraries

Building native openCV with NDK on android studio
声明我将在 build.gradle 文件中使用的静态库,并且我已经将第 3 方库复制到 /src/main/jniLibs/armeabi/3rdparty/:

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 的 undefined reference 错误:

/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 仍然无法解决,即使我已经将它放在预构建和依赖 block 中。 我该如何解决这个问题?

最佳答案

我已经按照@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"
            }
        }
    }
}

关于android - Gradle-Experimental :0. 6.0-beta5 的 OpenCV4Android 链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36278082/

相关文章:

android - 将 jlong​​ 转换为 long 是否安全?

Android:如何强制更新特定类型的所有小部件

c++ - OpenCV - 错误 C2244

python - 使用 opencv2 在 python 中编写流式视频

java - 如何根据角点和单元格数计算交点

android - swprintf() 不适用于 Android Kitkat 及以下版本?

java - 如何为 addOnGesturePerformedListener 创建单独的类

android - Firebase 多路径更新覆盖而不是更新子项

android - JavascriptInterface 不适用于 Android 4.2 上的混淆器

android - 自定义 ListView 适配器的 ResourceNotFoundException