Вопрос по android – Невозможно связать собственную библиотеку в образце OpenCV Android

12

У меня есть код OpenCV (c ++), который я хочу использовать в Android. Для этого я должен использоватьAndroid NDK, Я загрузилПакет OpenCV для разработки под Android (вер. 2.4.0) и сделал все шаги из этого руководства. Базовые примеры (только Java API) работают без проблем. Образец № 3(Tutorial 3 (Advanced) - Add Native OpenCV) правильно строит из ndk-builder. Но всегда получаю исключение, когда я пытаюсь запустить / отладить его на устройстве из eclipse:

Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lorg/opencv/samples/tutorial3/Sample3View;

В этой строке:

System.loadLibrary("native_sample");

Вот полный журнал logcat:

05-31 23:41:45.976: W/ActivityThread(9708): Application org.opencv.samples.tutorial3 is waiting for the debugger on port 8100...
05-31 23:41:45.983: I/System.out(9708): Sending WAIT chunk
05-31 23:41:45.983: I/dalvikvm(9708): Debugger is active
05-31 23:41:46.179: I/System.out(9708): Debugger has connected
05-31 23:41:46.179: I/System.out(9708): waiting for debugger to settle...
05-31 23:41:46.382: I/System.out(9708): waiting for debugger to settle...
05-31 23:41:46.585: I/System.out(9708): waiting for debugger to settle...
05-31 23:41:46.788: I/System.out(9708): waiting for debugger to settle...
05-31 23:41:46.983: I/System.out(9708): waiting for debugger to settle...
05-31 23:41:47.186: I/System.out(9708): waiting for debugger to settle...
05-31 23:41:47.389: I/System.out(9708): waiting for debugger to settle...
05-31 23:41:47.585: I/System.out(9708): waiting for debugger to settle...
05-31 23:41:47.788: I/System.out(9708): debugger has settled (1463)
05-31 23:41:47.819: D/szipinf(9708): Initializing inflate state
05-31 23:41:47.866: I/Sample::Activity(9708): Instantiated new class org.opencv.samples.tutorial3.Sample3Native
05-31 23:41:48.909: D/dalvikvm(9708): threadid=1: still suspended after undo (sc=1 dc=1)
05-31 23:41:51.770: I/Sample::Activity(9708): onCreate
05-31 23:41:59.283: W/dalvikvm(9708): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lorg/opencv/samples/tutorial3/Sample3View;
05-31 23:42:01.965: D/AndroidRuntime(9708): Shutting down VM
05-31 23:42:01.965: W/dalvikvm(9708): threadid=1: thread exiting with uncaught exception (group=0x40015560)
05-31 23:42:01.999: E/AndroidRuntime(9708): FATAL EXCEPTION: main
05-31 23:42:01.999: E/AndroidRuntime(9708): java.lang.ExceptionInInitializerError
05-31 23:42:01.999: E/AndroidRuntime(9708):     at org.opencv.samples.tutorial3.Sample3Native.onCreate(Sample3Native.java:21)
05-31 23:42:01.999: E/AndroidRuntime(9708):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-31 23:42:01.999: E/AndroidRuntime(9708):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722)
05-31 23:42:01.999: E/AndroidRuntime(9708):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784)
05-31 23:42:01.999: E/AndroidRuntime(9708):     at android.app.ActivityThread.access$1500(ActivityThread.java:123)
05-31 23:42:01.999: E/AndroidRuntime(9708):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939)
05-31 23:42:01.999: E/AndroidRuntime(9708):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-31 23:42:01.999: E/AndroidRuntime(9708):     at android.os.Looper.loop(Looper.java:130)
05-31 23:42:01.999: E/AndroidRuntime(9708):     at android.app.ActivityThread.main(ActivityThread.java:3835)
05-31 23:42:01.999: E/AndroidRuntime(9708):     at java.lang.reflect.Method.invokeNative(Native Method)
05-31 23:42:01.999: E/AndroidRuntime(9708):     at java.lang.reflect.Method.invoke(Method.java:507)
05-31 23:42:01.999: E/AndroidRuntime(9708):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
05-31 23:42:01.999: E/AndroidRuntime(9708):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
05-31 23:42:01.999: E/AndroidRuntime(9708):     at dalvik.system.NativeStart.main(Native Method)
05-31 23:42:01.999: E/AndroidRuntime(9708): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load native_sample: findLibrary returned null
05-31 23:42:01.999: E/AndroidRuntime(9708):     at java.lang.Runtime.loadLibrary(Runtime.java:429)
05-31 23:42:01.999: E/AndroidRuntime(9708):     at java.lang.System.loadLibrary(System.java:554)
05-31 23:42:01.999: E/AndroidRuntime(9708):     at org.opencv.samples.tutorial3.Sample3View.<clinit>(Sample3View.java:48)
05-31 23:42:01.999: E/AndroidRuntime(9708):     ... 14 more

Я нашел решения для той же проблемы, но ни один из них не помог мне:

Native OpenCV Samples for Android throws UnsatisfiedLinkError java.lang.UnsatisfiedLinkError: Couldn't load opencv_java: findLibrary returned null Major OpenCV-Android for Windows Installing and Running Issues (no answer)

Также я протестировал его на разных устройствах и версиях Android API.

Конфигурация моей системы:

[email protected]:~$ uname -a
Linux astor-K42Jv 3.2.0-24-generic-pae #39-Ubuntu SMP Mon May 21 18:54:21 UTC 2012 i686 i686 i386 GNU/Linux

Я пытался решить эту проблему в течение 4 ночей (это мое свободное время :)), но безуспешно. Мне очень нужно это для моей диссертации, поэтому любая помощь будет оценена.

Update: Я протестировал этот образец на Windows 7 (64), но результат тот же.

Похоже, это ошибка OpenCV.

Update: Журнал сборки:

[email protected]:/opt/eclipse-android/workspace/OpenCV-2.4.0-samples/tutorial-3-native$ ndk-build 
Install        : libnative_camera_r2.2.0.so => libs/armeabi-v7a/libnative_camera_r2.2.0.so
Install        : libnative_camera_r2.3.3.so => libs/armeabi-v7a/libnative_camera_r2.3.3.so
Install        : libnative_camera_r3.0.1.so => libs/armeabi-v7a/libnative_camera_r3.0.1.so
Install        : libnative_camera_r4.0.0.so => libs/armeabi-v7a/libnative_camera_r4.0.0.so
Install        : libnative_camera_r4.0.3.so => libs/armeabi-v7a/libnative_camera_r4.0.3.so
Install        : libnative_sample.so => libs/armeabi-v7a/libnative_sample.so

Ваш Ответ

3   ответа
16

Наконец-то я сам нашел решение этой проблемы!

Я решил отладить строку:

System.loadLibrary("native_sample");

Для этого я скачал исходный код Android из Android-SDK, а затем вложил исходную папку (/ Opt / Android-SDK-Linux / источники / андроида-15) для моего проекта. После этого я обнаружил, что ошибка была:

Cannot load library: link_image[1936]:    37 could not load needed library 'libopencv_java.so' for 'libhello-jni.so' (load_library[1091]: Library 'libopencv_java.so' not found)

И действительно, эта библиотека не вlib каталог. Я не знаю почему, ноndk-build проигнорировал это. Поэтому я решил скопировать и загрузить его вручную. Для этого я скопировалlibopencv_java.so от/opt/OpenCV-2.4.0/libs/armeabi-v7a а также отредактировал код Java:

static {
    System.loadLibrary("opencv_java"); //load opencv_java lib
    System.loadLibrary("native_sample");
}

На самом деле похожие проблемы:

Не могу загрузить библиотеки Opencv по необходимос Android OpenCV: невозможно открыть библиотеку оболочки камеры

Из второго решения я обнаружил, что могу загружать библиотеки, используя Dlopen, но я еще не пробовал.

Так что я напишу простой bash-скрипт, который сделает это (просто скопирует) для себя.

Спасибо всем

Даже с включением двух строк я сталкиваюсь с этой проблемой на некоторых устройствах. Srikar Reddy
2

Вместо загрузки вашей родной библиотеки как

static{
    System.loadLibrary("YOUR_LIBRARY");
}

Загрузите вашу библиотеку после того, как менеджер opencv подключен в методе "onManagerConnected" в вашем "BaseLoaderCallBack". Ниже приведен фрагмент кода, который работает для мен

public void onManagerConnected(int status) {
                switch(status){
                case LoaderCallbackInterface.SUCCESS:
                    Toast.makeText(getApplicationContext(), "manager connected", Toast.LENGTH_LONG).show();
                    System.loadLibrary("MYNATIVELIB");
                    break;
                default:
                    super.onManagerConnected(status);
                    break;
                }
            }
Большое спасибо! Это было решением для меня! sebasira
0

Вы на более высоком уровне, чем актуальная проблема. Видеть "Начало работы с NDK", когда ты бежишь

    cd <project>
    <ndk>/ndk-build

... что это говорит? (Не забудьте использовать окно Cygwin, а не приглашение DOS).

Что ты имеешь в виду "что это говорит?" Если сборка журнала, то смотритеОбновит моего вопроса (я строю из linux). ArtemStorozhuk
Хм ... звучит глупо, но ты чистил проект после ndk-build? Кроме того, проверьте «ловушку» или как она там называется, это выглядит как ... void Java_com_hw_ndk_HWNDKActivity_helloLog (JNIEnv * env, jobject this, jstring logThis) ... он должен соответствовать com.hw.ndk (имя пакета). Я новичок в этом сам. user426364
Конечно, я не убираю проект после сборки. Даже после запуска программы на устройстве библиотеки все еще находятся в папке lib. Может быть, вы имеете в виду утилиту Javah? Если так, то да, я проверил имя функции. ArtemStorozhuk
Я понимаю, что Eclipse на самом деле не интегрирована в процесс сборки (нативного кода). Когда вы запускаете ndk-build, он компилирует нативную библиотеку, но Eclipse не знает об этом. Таким образом, вы должны Project -> Clean после каждой сборки NDK. Затем запустите его в Eclipse. user426364
Мои действия: 1.ndk-build clean 2.ndk-build 3. project-> clean (сборка автоматически отключена) 4. Отладка в качестве приложения для Android. Результат тот же. ArtemStorozhuk

Похожие вопросы