我一直在尝试获取OpenCV和tesseract的android版本(tess-two)与我的android应用程序一起使用。我正在Android Studio 1.4中进行开发,问题是,如果我仅添加tess-two依赖项,则该应用程序可以正常运行,并且可以很好地加载tess-two库。接下来,当我将OpenCV依赖项添加到应用程序时,它破坏了对tess-two库的支持,并向我抛出此运行时错误:

Caused by: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.app.ocrapp-1/base.apk"],nativeLibraryDirectories=[/data/app/com.app.ocrapp-1/lib/arm64, /vendor/lib64, /system/lib64]]] couldn't find "libpngt.so"
at java.lang.Runtime.loadLibrary(Runtime.java:366)
at java.lang.System.loadLibrary(System.java:989)
at com.googlecode.tesseract.android.TessBaseAPI.<clinit>(TessBaseAPI.java:43)
at com.app.ocrapp.util.Libraries.<clinit>(Libraries.java:12)

一旦我从应用程序中删除了OpenCV库和依赖项,tess-two将再次开始工作。

这是我的 OpenCV build.gradle :
apply plugin: 'android-library'

    android {
        compileSdkVersion 21
        buildToolsVersion "21.1.2"

        defaultConfig {
            minSdkVersion 15
            targetSdkVersion 21
            versionCode 3000
            versionName "3.0.0"
        }

        sourceSets {
            main {
                manifest.srcFile 'AndroidManifest.xml'
                java.srcDirs = ['src']
                resources.srcDirs = ['src']
                res.srcDirs = ['res']
                aidl.srcDirs = ['src']
                jniLibs.srcDirs = ['oclibs']
            }
        }
    }

这是我的 tess-两个build.gradle :
apply plugin: 'android-library'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 21
    }

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            res.srcDirs = ['res']
            jniLibs.srcDirs = ['libs']
        }
    }
}

这也是我的项目结构的图片,每个库都被圈了起来,各自的libs文件夹也被圈了起来(包含.so文件):
Project Structure

所有帮助将不胜感激。我几天来一直在尝试解决此问题。

----- 编辑 ------

我已经解决了这个问题,并在下面发布了解决方案。

最佳答案

好吧,我终于明白了。 OpenCV库在本机libs文件夹内有一个名为“arm64-v8a”的文件夹,而tess-two库不包含此类文件夹。
这是一个问题,因为当没有适用于Android的tesseract的64位库(tess-two)可用时,“arm64-v8a”文件夹将使应用程序以64位模式运行,从而引发问题中所示的崩溃。

为了解决这个问题,我只是排除了“arm64-v8a”文件夹。

在您的应用程序build.gradle和defaultConfig内部添加:

packagingOptions {
        exclude "lib/arm64-v8a/FILE_NAME.SO"
}

现在显示FILE_NAME.so,将其替换为OpenCV“arm64-v8”文件夹中文件之一的文件名。根据需要添加排除行,以排除arm64-v8文件夹内的所有文件。

10-08 15:32