2012-06-01 10 views
12

Tengo el código OpenCV (C++), que quiero usar en Android. Para hacer esto, tengo que usar Android NDK. Descargué OpenCV package for Android development (versión 2.4.0) e hice todos los pasos de ese manual. Las muestras básicas (API de Java solamente) se ejecutan sin problemas. Sample # 3 (Tutorial 3 (Avanzado) - Agregar Native OpenCV) compilaciones desde ndk-builder correctamente. Pero siempre nos dieron una excepción cuando estoy tratando de correr/depurarlo en el dispositivo de Eclipse:No se puede vincular la biblioteca nativa en la muestra de Android OpenCV

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

En esta línea:

System.loadLibrary("native_sample"); 

Aquí registro Logcat completo:

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 encontrar soluciones para el mismo problema, pero ninguno de ellos no me ayudó:

  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 (no respuesta)

También he probado en diferentes dispositivos y versiones de la API de Android.

Mi configuración 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 

Me han tratado de solucionar este problema por 4 noches (es mi tiempo libre :)), pero sin suerte. Realmente necesito esto para mi tesis, por lo que cualquier ayuda será apreciada.


Actualización: He probado esta muestra en Windows 7 (64), pero resultado es el mismo.

Parece que se trata de un error de OpenCV.


Actualización: registro de generación:

[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

posible duplicado de [bibliotecas no son del sistema de banderas de engarce] (http://stackoverflow.com/questions/24669518/non-system-libraries-in-linker-flags) –

Respuesta

16

Whoohoo!

¡Finalmente encontré la solución para este problema yo solo!

decidí línea de depuración:

System.loadLibrary("native_sample"); 

Para ello he descargado el código fuente de Android desde Android SDK y luego unidas fuente carpeta (/ opt/android-sdk-linux/fuentes/android-15) a mi proyecto. Después de esto me di cuenta de que era error:

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) 

Y realmente esta biblioteca no está en lib directorio. No sé por qué, pero ndk-build lo ignoró. Así que decidí copiar y cargarlo manualmente. Por esta copié libopencv_java.so de /opt/OpenCV-2.4.0/libs/armeabi-v7a y también editado el código de Java:

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

problemas En realidad similares son:

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

partir de la segunda solución que encontré lo que pueda cargar bibliotecas utilizando dlopen, pero aún no lo he probado.

Así que escribiré bash-script simple que lo hará (solo copie) para mí.

Gracias a todos.

+0

Incluso con la inclusión de dos líneas, estoy enfrentando este problema en algunos dispositivos. –

0

Estás en un nivel más alto que el problema real. Ver "Getting started with the NDK", al ejecutar

cd <project> 
    <ndk>/ndk-build 

... ¿qué dice? (Recuerde usar la ventana de cygwin y no un mensaje de dos).

+0

¿Qué quieres decir con "¿qué dice?" Si el registro de compilación ver ** la actualización ** de mi pregunta (construyo desde Linux). – ArtemStorozhuk

+0

Hm ... va a sonar estúpido, pero ¿limpiaste el proyecto después del ndk-build? Además, verifique el "gancho" o lo que se llame, se ve como ... void Java_com_hw_ndk_HWNDKActivity_helloLog (JNIEnv * env, jobject this, jstring logThis) ... tiene que corresponder a com.hw.ndk (el nombre del paquete) . Soy nuevo en esto yo mismo. – user426364

+0

Por supuesto que no limpio el proyecto después de la compilación. Incluso después de ejecutar el programa en el dispositivo, las bibliotecas todavía están en la carpeta lib. ¿Quizás te refieres a la utilidad javah? Si es así, entonces sí, verifiqué el nombre de la función. – ArtemStorozhuk

1

En lugar de cargar su biblioteca nativa como

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

cargar su biblioteca después de gestor de OpenCV está conectado en el método "onManagerConnected" en el que "BaseLoaderCallBack". Lo que sigue es mi fragmento de código funciona para mí

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

¡Muchas gracias! ¡Esta fue la solución para mí! – sebasira

Cuestiones relacionadas