Gradle实验性JNI OpenCv arm 64-v8a链接器错误

时间:2016-04-22 12:56:06

标签: android opencv linker java-native-interface

我有一个使用opencv android sdk的项目,为了加快速度,决定用C ++实现一些函数。

无论如何我正在使用gradle实验插件0.4.0以及何时为arm64-v8a构建,链接器告诉我它无法在jniLibs文件夹中找到库..尝试了许多不同的变体,我相信路径是正确的(使用cd)检查终端

这是我的app.gradle:

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



android {

    compileSdkVersion = 23
    buildToolsVersion = "23.0.2"
   /* sourceSets.main {
        jniLibs.srcDir 'src/main/jniLibs' //set libs as .so's location instead of jni
        jni.srcDirs = [] //disable automatic ndk-build call with auto-generated Android.mk file
    }*/
    defaultConfig.with {
        applicationId = "com.sketchcamera.camera"
        minSdkVersion.apiLevel = 15
        targetSdkVersion.apiLevel = 23
        versionCode = 105
        versionName = "1.05"
    }


}


android.buildTypes {
    release {
        minifyEnabled = false
        proguardFiles.add(file('proguard-android.txt'))
        //proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        //jniDebuggable = true
        //  signingConfig signingConfigs.release
    }
    debug {
        //jniDebuggable = true
    }
}
android.productFlavors {
    create("AArch-64") {
        ndk.with{
            abiFilters.add("arm64-v8a")

            File curDir = file('./')
            curDir = file(curDir.absolutePath)
            String libsDir = curDir.absolutePath + "/src/main/jniLibs/arm64-v8a/"

            ldLibs.add(libsDir + "libopencv_core.a")
            ldLibs.add(libsDir + "libopencv_highgui.a")
            ldLibs.add(libsDir + "libopencv_imgproc.a")
            ldLibs.add(libsDir + "libopencv_java3.so")
            ldLibs.add(libsDir + "libopencv_ml.a")

        }
    }
    create("arm") {
        ndk.with{
            abiFilters.add("armeabi")

            File curDir = file('./')
            curDir = file(curDir.absolutePath)
            String libsDir = curDir.absolutePath + "/src/main/jniLibs/armeabi/"

            ldLibs.add(libsDir + "libopencv_core.a")
            ldLibs.add(libsDir + "libopencv_highgui.a")
            ldLibs.add(libsDir + "libopencv_imgproc.a")
            ldLibs.add(libsDir + "libopencv_java3.so")
            ldLibs.add(libsDir + "libopencv_ml.a")

        }
    }
    create("armv7") {
        ndk.with {
            abiFilters.add("armeabi-v7a")

            File curDir = file('./')
            curDir = file(curDir.absolutePath)
            String libsDir = curDir.absolutePath + "/src/main/jniLibs/armeabi-v7a/"
            ldLibs.add(libsDir + "libopencv_core.a")
            ldLibs.add(libsDir + "libopencv_highgui.a")
            ldLibs.add(libsDir + "libopencv_imgproc.a")
            ldLibs.add(libsDir + "libopencv_java3.so")
            ldLibs.add(libsDir + "libopencv_ml.a")
            ldLibs.add(libsDir + "libopencv_ts.a")

        }
    }
}

android.ndk {
    moduleName = "opencv_fast_processing"
    cppFlags.add("-std=c++11")
    cppFlags.add("-fexceptions")
    cppFlags.add("-I${file("/home/onur/Masaüstü/Home/OpenCV-android-sdk/sdk/native/jni/include")}".toString())
    ldLibs.addAll(["android", "EGL", "GLESv2", "dl", "log", "z"])
    stl = "gnustl_shared"
}
// android.useLibrary = 'org.apache.http.legacy'

}

如果我使用arm7或arm,一切都很好但是如果使用arm64-v8a进行编译,则链接器会出现此错误:

/home/onur/Android/android-ndk-r11c/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/../lib/gcc/aarch64-linux-android/4.9/../../../../aarch64-linux-android/bin/ld: cannot find -l/home/onur/AndroidStudioProjects/SketchCamera/app/src/main/jniLibs/arm64-v8a/libopencv_core.a

和其他文件的错误相同.. 正如我所说的那样,我确信路径是正确的,但不知道/ home前面的-l是什么(对C和gnu没有多少经验)

我是这个JNI的新手,很可能做了一些愚蠢的事情。谢谢你的帮助

1 个答案:

答案 0 :(得分:3)

我遇到了同样的问题,但是libcrypto(OpenSSL)。 我设法通过更改我的build.gradle文件来解决它。而是使用productFlavors我更改为repositores部分,如下例所示:

删除这段代码:

abis {
        create("x86") {
            ldLibs.add("${file("src/main/jniLibs/x86/libcrypto.so")}".toString())
        }
        create("x86_64") {
            ldLibs.add("${file("src/main/jniLibs/x86_64/libcrypto.so")}".toString())
        }
        create("armeabi-v7a") {
            ldLibs.add("${file("src/main/jniLibs/armeabi-v7a/libcrypto.so")}".toString())
        }
        create("arm64-v8a") {
            ldLibs.add("${file("src/main/jniLibs/armeabi-v7a/libcrypto.so")}".toString())
        }
    }

并添加以下内容:

repositories {
    prebuilt(PrebuiltLibraries) {
        prebuiltSharedlib {
            binaries.withType(SharedLibraryBinary) {
                sharedLibraryFile = file("src/main/jniLibs/${targetPlatform.getName()}/libcrypto.so")
            }
        }
    }
}
android.sources {
    main {
        jni {
            dependencies {
                library "prebuiltSharedlib"
            }
        }
    }
}

最后在ndk部分内设置ABI过滤器:

abiFilters.addAll(["armeabi-v7a", "arm64-v8a", "x86", "x86_64"])

希望它有所帮助。