Собственные образцы OpenCV для Android выдает UnsatisfiedLinkError - PullRequest
4 голосов
/ 04 октября 2011

Я пытаюсь запустить образцы андроида opencv на эмуляторе. Примеры с нативным кодом, например Образец "Tutorial 2 Advanced - 1. Добавить Native OpenCV" завершается неудачно. У меня система Win7 x86. Я могу собрать нативные библиотеки, но всегда получаю следующее исключение, если запускаю образец:

<code> 
10-04 08:08:19.179: WARN/dalvikvm(696): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lorg/opencv/samples/tutorial3/Sample3View;
10-04 08:08:19.190: DEBUG/AndroidRuntime(696): Shutting down VM
10-04 08:08:19.190: WARN/dalvikvm(696): threadid=1: thread exiting with uncaught exception (group=0x40015560)
10-04 08:08:19.289: ERROR/AndroidRuntime(696): FATAL EXCEPTION: main
10-04 08:08:19.289: ERROR/AndroidRuntime(696): java.lang.ExceptionInInitializerError
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at org.opencv.samples.tutorial3.Sample3Native.onCreate(Sample3Native.java:23)
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at android.os.Looper.loop(Looper.java:123)
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at android.app.ActivityThread.main(ActivityThread.java:3683)
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at java.lang.reflect.Method.invokeNative(Native Method)
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at java.lang.reflect.Method.invoke(Method.java:507)
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at dalvik.system.NativeStart.main(Native Method)
10-04 08:08:19.289: ERROR/AndroidRuntime(696): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load native_sample: findLibrary returned null
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at java.lang.Runtime.loadLibrary(Runtime.java:429)
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at java.lang.System.loadLibrary(System.java:554)
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     at org.opencv.samples.tutorial3.Sample3View.(Sample3View.java:27)
10-04 08:08:19.289: ERROR/AndroidRuntime(696):     ... 14 more
10-04 08:08:19.389: WARN/ActivityManager(70):   Force finishing activity org.opencv.samples.tutorial3/.Sample3Native
10-04 08:08:19.959: WARN/ActivityManager(70): Activity pause timeout for HistoryRecord{406f26a0 org.opencv.samples.tutorial3/.Sample3Native}
10-04 08:08:20.089: DEBUG/dalvikvm(70): GC_EXPLICIT freed 92K, 47% free 4404K/8263K, external 5449K/5830K, paused 103ms

Есть идеи, как решить эту проблему? Спасибо

Ответы [ 2 ]

15 голосов
/ 04 октября 2011

Измените строку

APP_ABI := armeabi-v7a

в jni/Application.mk на

APP_ABI := armeabi

По умолчанию образцы OpenCV настроены для современного оборудования armv7-a.

4 голосов
/ 29 ноября 2012

Действительно хороший ответ от Андрея Камаева!

Вот то, что я только что узнал из моего опыта:

Если вам известны данные об оборудовании (для вашего случая это x86) .. вы можете указать следующее:

APP_ABI: = x86

Мы также можем определить в jni / Application.mk следующее:

APP_ABI: = armeabi armeabi-v7a x86

Теперь, когда мы создаем приложение, будет создано 3 файла библиотеки общих объектов. Затем, когда мы запустим приложение, на основе целевого устройства будет загружена соответствующая библиотека.

Когда я запускал образец собственного приложения OpenCV Android на планшете (так как его аппаратная поддержка armeabi-v7a), он работал нормально, но на моем мобильном телефоне Samsung Galaxy ACE не удалось запустить то же приложение (не поддерживает armeabi-v7a).

Итак, я установил APP_ABI: = armeabi armeabi-v7a, и теперь приложение прекрасно работает как на планшете, так и на телефоне:)

...