2012-06-01 9 views
12

Mam kod OpenCV (C++), którego chcę używać w systemie Android. Aby to zrobić, muszę użyć Android NDK. Pobrałem OpenCV package for Android development (wersja 2.4.0) i wykonałem wszystkie kroki z tej instrukcji. Podstawowe próbki (tylko Java API) działają bez problemów. Próbka # 3 (Samouczek 3 (Zaawansowane) - Dodaj Natywny OpenCV) kompiluje poprawnie z ndk-builder. Ale zawsze dostaje wyjątek, gdy próbuję uruchomić/debugowanie na urządzeniu z Eclipse:Nie można połączyć biblioteki natywnej w przykładzie OpenCV Android

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

W tej linii:

System.loadLibrary("native_sample"); 

Oto pełny log 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 

I znajdź rozwiązania dla tego samego problemu, ale żaden z nich mi nie pomógł:

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

Także ja testowałem go na różne urządzenia i wersji Androida API.

Moja konfiguracja systemu:

[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 

Byłem starał się rozwiązać ten problem przez 4 dni (to mój wolny czas :)), ale bez powodzenia. Naprawdę potrzebuję tego do mojej pracy magisterskiej, więc każda pomoc zostanie doceniona.


Aktualizacja: Ja testowałem tę próbkę na Windows 7 (64), ale wynik jest taki sam.

Wygląda na to, że jest to błąd OpenCV.


Aktualizacja: dziennika budowy:

[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 
+0

możliwe duplikat [bibliotek non-systemowych w flagami łącznikowych] (http://stackoverflow.com/questions/24669518/non-system-libraries-in-linker-flags) –

Odpowiedz

16

Whoohoo!

W końcu znalazłem rozwiązanie tego problemu sam!

postanowiłem linii debug:

System.loadLibrary("native_sample"); 

Aby to Pobrałem kod źródłowy android z Android SDK zrobić, a następnie dołączone źródło folderu (/ opt/android-sdk-linux/sources/android-15) do mojego projektu. Potem znalazłem tego błędu było:

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) 

I rzeczywiście ta biblioteka nie jest w lib katalogu. Nie wiem dlaczego, ale zignorowałem to. Więc postanowiłem skopiować i załadować go ręcznie. Do tego kopiowane libopencv_java.so z /opt/OpenCV-2.4.0/libs/armeabi-v7a i także zmieniony kod Java:

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

Właściwie podobne problemy to:

  1. Can not load Opencv libraries in necessitas
  2. Android OpenCV: cannot dlopen camera wrapper library

Od drugiego rozwiązania odkryłem, że mogę ładuj biblioteki używając dlopen, ale jeszcze tego nie próbowałem.

Więc napiszę prosty skrypt, który to zrobi (po prostu skopiuj) dla siebie.

Dziękuję wszystkim.

+0

Nawet z włączeniem dwóch linii napotykam ten problem na niektórych urządzeniach. –

0

Jesteś na wyższym poziomie niż rzeczywistego problemu. Patrz: "Getting started with the NDK" po uruchomieniu:

... co to znaczy? (Pamiętaj, aby użyć okna cygwin, a nie polecenia dos).

+0

Co masz na myśli "co to znaczy?" Jeśli dziennik kompilacji zobacz ** aktualizację ** mojego pytania (buduję z Linuksa). – ArtemStorozhuk

+0

Hm ... Brzmi głupio, ale czy wyczyściłeś projekt po ndk-build? Sprawdź także "hook" lub jakkolwiek to się nazywa, wygląda na to, że ... void Java_com_hw_ndk_HWNDKActivity_helloLog (JNIEnv * env, jobject this, log_jstringThis) ... musi odpowiadać com.hw.ndk (nazwa pakietu) . Sam jestem nowy. – user426364

+0

Oczywiście nie czyszczę projektu po kompilacji. Nawet po uruchomieniu programu na urządzeniu biblioteki nadal znajdują się w folderze lib. Może masz na myśli narzędzie javah? Jeśli tak, to tak, sprawdziłem nazwę funkcji. – ArtemStorozhuk

1

Zamiast ładować swoje natywne biblioteki jako

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

załadować bibliotekę OpenCV menedżer po podłączeniu w „onManagerConnected” metody w was „BaseLoaderCallBack”. Poniżej jest mój urywek kodu działa dla mnie

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; 
       } 
      } 
+0

Dziękuję bardzo! To było rozwiązanie dla mnie! – sebasira

Powiązane problemy