【问题标题】:Android OCR: Unsatisfied Link ErrorAndroid OCR:不满意的链接错误
【发布时间】:2016-01-06 04:28:03
【问题描述】:

我是一名学生,正在为我的学校项目开发 OCR 功能。到目前为止,我能够实现这些功能并成功运行应用程序。

我在 Android Studio 1.5.1 上安装了我的应用程序,并且能够在我的旧设备 Samsung Galaxy Note 3 API 21 上运行它。最近,我更改我的设备为 Samsung Galaxy Note 5 API 22,每当我尝试运行 OCR 功能时应用程序就会崩溃。

下面是logcat:

致命异常:java.lang.IllegalStateException:无法执行 活动方式 在 android.view.View$1.onClick(View.java:4298) 在 android.view.View.performClick(View.java:5254) 在 android.widget.TextView.performClick(TextView.java:10557) 在 android.view.View$PerformClick.run(View.java:21203) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:145) 在 android.app.ActivityThread.main(ActivityThread.java:6897) 在 java.lang.reflect.Method.invoke(Method.java) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 引起 通过 java.lang.reflect.InvocationTargetException 在 java.lang.reflect.Method.invoke(Method.java) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 android.view.View$1.onClick(View.java:4293) 在 android.view.View.performClick(View.java:5254) 在 android.widget.TextView.performClick(TextView.java:10557) 在 android.view.View$PerformClick.run(View.java:21203) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:145) 在 android.app.ActivityThread.main(ActivityThread.java:6897) 在 java.lang.reflect.Method.invoke(Method.java) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 引起 通过 java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip 文件 "/data/app/com.example.l33902.contactmanagment1512-2/base.apk"],nativeLibraryDirectories=[/data/app/com.example.l33902.contactmanagment1512-2/lib/arm64, /vendor/lib64, /system/lib64]]] 找不到“libpngt.so” 在 java.lang.Runtime.loadLibrary(Runtime.java:367) 在 java.lang.System.loadLibrary(System.java:988) 在 com.googlecode.tesseract.android.TessBaseAPI.(TessBaseAPI.java:43) 在 com.example.l33902.contactmanagment1512.ShowImage.initTess(ShowImage.java:171) 在 com.example.l33902.contactmanagment1512.ShowImage$OCR.onPreExecute(ShowImage.java:551) 在 android.os.AsyncTask.executeOnExecutor(AsyncTask.java:591) 在 android.os.AsyncTask.execute(AsyncTask.java:539) 在 com.example.l33902.contactmanagment1512.ShowImage.startOCR(ShowImage.java:188) 在 java.lang.reflect.Method.invoke(Method.java) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 android.view.View$1.onClick(View.java:4293) 在 android.view.View.performClick(View.java:5254) 在 android.widget.TextView.performClick(TextView.java:10557) 在 android.view.View$PerformClick.run(View.java:21203) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:145) 在 android.app.ActivityThread.main(ActivityThread.java:6897) 在 java.lang.reflect.Method.invoke(Method.java) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)

我已在此应用程序中实现了 Crashlytics,以下是所述崩溃的原因:

上述错误是 Unsatisfied Link Error,它表示应用程序失败,因为它无法加载库“libpngt.so”。

问题是,我之前在 Android Studio 上使用 Galaxy Note 3 时遇到过这个错误,并通过将“libpngt.so”放在“tess-two\libs\armeabi-”中来解决它v7a”目录。它仍在 Galaxy Note 3 上运行

如下图:

我还搜索了许多网站以寻找解决方案。 NDK build 也已经构建成功了。

目前我不确定下一步我能做什么,因为我之前已经解决了这个错误,但是这个实例出现了同样的问题,而之前的解决方案不起作用。

会不会是由 logcat 中未说明的任何其他错误引起的?也许API的变化?只是想知道,请提供任何可能的建议来帮助我,因为我仍然是 Android 开发的初学者。提前致谢!

【问题讨论】:

  • 对应*.so文件可能有一个lib文件。如果是这样,您是否将它们包含在项目的构建路径中?您是要移植现有的 Eclipse 项目还是构建新项目?您可以尝试删除“app\build”下的文件夹,然后清理>构建
  • 这曾经是一个ecilpse项目,但是我已经移植到Android Studio并且可以成功运行。仅在我将设备切换到三星 Note 5 后才会出现此问题。
  • 您使用的是哪个 OCR SDK?检查您使用的 OCR SDK 版本是否支持该设备。有些可能不适用于更高版本。
  • @Harry 您好,感谢您的回复,我使用的 tesseract 库文件是从这个链接下载的,github.com/rmtheis/tess-two。它能够在 API 21 android 5.0 上运行,我的新设备是 5.1.1

标签: android android-studio ocr tesseract


【解决方案1】:

我认为 Galaxy Note 5 是一款 ARMv8 手机。尝试在 Application.mk 文件的 APP_ABI 行上使用 arm64-v8a 重建库:

APP_ABI := armeabi-v7a x86 mips arm64-v8a x86_64 mips64

这样做之后,您的libs 目录下应该有六个包含 *.so 文件的目录。

【讨论】:

  • 嗨@rmtheis,非常感谢您的回复。我现在正尝试在 Note 5 上运行它,它已经可以在 Note 3 上运行。我的 Application.mk 文件中已经有你所说的“APP_ABI := armeabi-v7a x86 mips arm64-v8a x86_64 mips64”行。那么如何为 Note 5 实现它呢?
  • 我刚查过:注3是armeabi-v7a,注5是arm64-v8a
  • 以下是当前在我的Application.mk中的信息: APP_STL := gnustl_static APP_ABI := armeabi-v7a x86 mips # arm64-v8a x86_64 mips64 APP_OPTIM := release APP_PLATFORM := android-8 APP_CPPFLAGS + = -fexceptions -frtti NDK_TOOLCHAIN_VERSION := 4.8
  • 好的。从该行中删除#,然后重新运行构建。 # 标记评论的开始,因此当前忽略该点之后的所有内容。
猜你喜欢
  • 2016-04-26
  • 2014-03-26
  • 2012-04-22
  • 2013-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-09
  • 1970-01-01
相关资源
最近更新 更多