【问题标题】:Android UnsatisfiedLinkError With Tesseract and OpenCV使用 Tesseract 和 OpenCV 的 Android UnsatisfiedLinkError
【发布时间】:2015-10-09 05:59:18
【问题描述】:

我一直在尝试让 OpenCV 和 tesseract (tess-two) 的 android 版本与我的 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-two 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 的“oclibs”文件夹中,我有以下文件夹; arm64-v8a、armeabi、armeabi-v7a、mips、mips64、x86、x86。在这些文件夹中,我拥有 opencv for android 标准的所有 .so 文件。现在在 tess-two 的“lib”文件夹中,我有以下文件夹; armeabi-v7a,mips,x86。这些也是 tess-two 的标准库。他们拥有运行所需的所有 .so 文件

标签: android opencv tesseract unsatisfiedlinkerror tess-two


【解决方案1】:

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

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

在您的应用 build.gradle 和 defaultConfig 中添加:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 2014-04-04
    • 2018-12-02
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    相关资源
    最近更新 更多