我一直在尝试使用OpenCV和android版本的tesseract(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-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']
}
}
}
此处还有我的项目结构图片,每个图书馆都圈有各自的文件夹文件夹(包含.so文件): Project Structure
非常感谢所有帮助。我一直试图解决这个问题几天。
- - - - 修改 ------
我已经解决了这个问题,并在下面发布了一个解决方案。
答案 0 :(得分:2)
好的,所以我终于明白了。 OpenCV库在本机libs文件夹中有一个名为“arm64-v8a”的文件夹,而tess-two库不包含这样的文件夹。 这是一个问题,因为“arm64-v8a”文件夹将使应用程序在64位模式下运行时没有64位库可用于tesseract for android(tess-two),从而引发问题中显示的崩溃。
要解决此问题,我只是排除了“arm64-v8a”文件夹。
在您的应用内部build.gradle和defaultConfig内添加:
packagingOptions {
exclude "lib/arm64-v8a/FILE_NAME.SO"
}
现在它说FILE_NAME.so,将其替换为OpenCV“arm64-v8”文件夹中其中一个文件的文件名。根据需要多次添加排除行,以排除arm64-v8文件夹中的所有文件。