Почему я получаю java.lang.ExceptionInInitializerError, когда я запускаю приложение для Android, которое использует tes 2 OCR engine

Это отчет logcat, который я получаю при запуске приложения

07-06 15:39:40.151: E/AndroidRuntime(6777): FATAL EXCEPTION: main
07-06 15:39:40.151: E/AndroidRuntime(6777): java.lang.ExceptionInInitializerError
07-06 15:39:40.151: E/AndroidRuntime(6777):     at edu.sfsu.cs.orange.ocr.CaptureActivity.initOcrEngine(CaptureActivity.java:714)
07-06 15:39:40.151: E/AndroidRuntime(6777):     at edu.sfsu.cs.orange.ocr.CaptureActivity.onResume(CaptureActivity.java:371)
07-06 15:39:40.151: E/AndroidRuntime(6777):     at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1184)
07-06 15:39:40.151: E/AndroidRuntime(6777):     at android.app.Activity.performResume(Activity.java:5082)
07-06 15:39:40.151: E/AndroidRuntime(6777):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2569)
07-06 15:39:40.151: E/AndroidRuntime(6777):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2607)
07-06 15:39:40.151: E/AndroidRuntime(6777):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2093)
07-06 15:39:40.151: E/AndroidRuntime(6777):     at android.app.ActivityThread.access$600(ActivityThread.java:134)
07-06 15:39:40.151: E/AndroidRuntime(6777):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1199)
07-06 15:39:40.151: E/AndroidRuntime(6777):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-06 15:39:40.151: E/AndroidRuntime(6777):     at android.os.Looper.loop(Looper.java:137)
07-06 15:39:40.151: E/AndroidRuntime(6777):     at android.app.ActivityThread.main(ActivityThread.java:4744)
07-06 15:39:40.151: E/AndroidRuntime(6777):     at java.lang.reflect.Method.invokeNative(Native Method)
07-06 15:39:40.151: E/AndroidRuntime(6777):     at java.lang.reflect.Method.invoke(Method.java:511)
07-06 15:39:40.151: E/AndroidRuntime(6777):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
07-06 15:39:40.151: E/AndroidRuntime(6777):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
07-06 15:39:40.151: E/AndroidRuntime(6777):     at dalvik.system.NativeStart.main(Native Method)
07-06 15:39:40.151: E/AndroidRuntime(6777): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load lept: findLibrary returned null
07-06 15:39:40.151: E/AndroidRuntime(6777):     at java.lang.Runtime.loadLibrary(Runtime.java:365)
07-06 15:39:40.151: E/AndroidRuntime(6777):     at java.lang.System.loadLibrary(System.java:535)
07-06 15:39:40.151: E/AndroidRuntime(6777):     at com.googlecode.tesseract.android.TessBaseAPI.<clinit>(TessBaseAPI.java:44)
07-06 15:39:40.151: E/AndroidRuntime(6777):     ... 17 more

Я пытаюсь запустить приложение OCR, используя загруженную библиотеку tess-two. Я открыл этот проект в Eclipse и добавил в качестве библиотеки в мой проект. Но когда я запускаю приложение, оно вылетает, выдавая вышеуказанный журнал. Нужно ли мне скомпилировать библиотеку tess два перед запуском моего приложения. Если это так, пожалуйста, помогите мне, как я могу скомпилировать его на компьютере с Windows 8.

1 ответ

Решение

Смотрите в нижней части вашего Stack-Trace:

Caused by: java.lang.UnsatisfiedLinkError: Couldnt load lept: findLibrary returned null
    at java.lang.Runtime.loadLibrary(Runtime.java:365)
    at java.lang.System.loadLibrary(System.java:535)
    [...]

В вашем коде вы используете нативные библиотеки (например, библиотеки, написанные на C/C++ и связанные с JNI). Проблема здесь в том, что файлы-библиотеки не могут быть найдены Android. Поэтому UnsatisfiedLinkError брошен

Исходные источники вашего приложения должны быть расположены в jni/-подкаталог вашего проекта. Вам также понадобится скрипт сборки для сборки ваших исходников с помощью кросс-компилятора NDK. В вашем случае эти файлы поставляются вместе с библиотекой.

В общем, скомпилированный .so-файлы идут в libs/-папка вашего проекта и может быть загружена с помощью System.loadLibrary(String) -метод, часто помещаемый в блок статического инициализатора:

System.loadLibrary("filename");

Дополнительную информацию о размещении библиотеки можно найти здесь: Как импортировать нативную библиотеку (файл.so) в Eclipse?

Другие вопросы по тегам