2012-06-01 10 views
12

Ho codice OpenCV (C++), che voglio utilizzare in Android. Per fare questo devo usare Android NDK. Ho scaricato OpenCV package for Android development (versione 2.4.0) e ho fatto tutti i passaggi da quel manuale. Gli esempi di base (solo API Java) funzionano senza problemi. Esempio n. (Tutorial 3 (avanzato) - Aggiungi Native OpenCV) build da ndk-builder correttamente. Ma sempre ottenuto eccezione quando sto cercando di eseguire/debug sul dispositivo da Eclipse:Impossibile collegare la libreria nativa nel campione OpenCV Android

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

In questa linea:

System.loadLibrary("native_sample"); 

Ecco registro completo 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 trovare soluzioni per lo stesso problema ma nessuno di loro non mi ha aiutato:

  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 (nessuna risposta)

anche io ho testato su diversi dispositivi e versioni API di Android.

La mia configurazione del sistema:

[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 

Ho cercato di risolvere questo problema per 4 notti (è il mio tempo libero :)), ma senza fortuna. Ho davvero bisogno di questo per la mia tesi, quindi ogni aiuto sarà apprezzato.


Update: Ho testato questo campione su Windows 7 (64), ma risultato è lo stesso.

Sembra che questo sia un bug di OpenCV.


Aggiornamento: log di compilazione:

[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

possibile duplicato del [librerie non di sistema in bandiere linker] (http://stackoverflow.com/questions/24669518/non-system-libraries-in-linker-flags) –

risposta

16

Whoohoo!

Finalmente ho trovato la soluzione per questo problema da solo!

ho deciso di riga di debug:

System.loadLibrary("native_sample"); 

Per fare questo ho scaricato il codice sorgente di Android da Android-SDK e poi attaccato fonte cartella (/ opt/android-sdk-linux/sorgenti/android-15) al mio progetto. Dopo questo ho scoperto che l'errore era:

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) 

E in realtà questa libreria non è in lib directory. Non so perché ma ndk-build l'ho ignorato. Così ho deciso di copiarlo e caricarlo manualmente. Per questo ho copiato libopencv_java.so da /opt/OpenCV-2.4.0/libs/armeabi-v7a e codice Java anche modificato:

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

problemi realtà simili sono:

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

Dalla seconda soluzione che ho trovato che posso caricare le librerie usando dlopen, ma non l'ho ancora provato.

Così scriverò un semplice script bash che lo farà (basta copiare) per me stesso.

Grazie a tutti.

+0

Anche con l'inclusione di due linee, sto affrontando questo problema su alcuni dispositivi. –

0

Sei in un livello superiore rispetto al problema reale. Vedere "Getting started with the NDK", quando si esegue

cd <project> 
    <ndk>/ndk-build 

... cosa dice? (Ricordarsi di usare la finestra di cygwin e non un prompt di dos).

+0

Cosa intendi "cosa dice?" Se il registro di build poi vedere ** aggiornamento ** della mia domanda (I build from linux). – ArtemStorozhuk

+0

Hm .. sembrerà stupido, ma hai ripulito il progetto dopo la ndk-build? Inoltre, controlla il "gancio" o come si chiama, sembra ... vuoto Java_com_hw_ndk_HWNDKActivity_helloLog (JNIEnv * env, jobject this, jstring logThis) ... deve corrispondere a com.hw.ndk (il nome del pacchetto) . Sono nuovo di questo me stesso. – user426364

+0

Ovviamente non pulisco il progetto dopo la costruzione. Anche dopo aver eseguito il programma sul dispositivo, le librerie sono ancora nella cartella lib. Forse intendi l'utilità di Java? Se è così, allora sì, ho controllato il nome della funzione. – ArtemStorozhuk

1

Invece di caricare la tua libreria nativa come

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

caricare la libreria dopo direttore OpenCV è collegato in modalità "onManagerConnected" in voi "BaseLoaderCallBack". In seguito è il mio frammento di codice lavorando per me

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

Grazie mille! Questa era la soluzione per me! – sebasira

Problemi correlati