簡體   English   中英

使用 Tesseract 和 OpenCV 的 Android UnsatisfiedLinkError

[英]Android UnsatisfiedLinkError With Tesseract and OpenCV

我一直在嘗試讓 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 文件):項目結構

所有幫助將不勝感激。 這幾天我一直在努力解決這個問題。

-----編輯------

我已經解決了這個問題,並在下面發布了一個解決方案。

好吧,所以我終於想通了。 OpenCV 庫在本機 libs 文件夾中有一個名為“arm64-v8a”的文件夾,而 tess-two 庫不包含這樣的文件夾。 這是一個問題,因為當沒有可用於 tesseract for android (tess-two) 的 64 位庫時,“arm64-v8a”文件夾將使應用程序以 64 位模式運行,從而引發問題中顯示的崩潰。

為了解決這個問題,我只是排除了“arm64-v8a”文件夾。

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

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

現在它說 FILE_NAME.so,用你的 OpenCV“arm64-v8”文件夾中的文件之一的文件名替換它。 根據需要多次添加 exclude 行以排除 arm64-v8 文件夾中的所有文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM