2012-06-05 10 views
6

Tengo un proyecto de Android, que tiene código nativo. En esta parte nativa uso OpenCV. Todo compila y funciona bien cuando uso OpenCV 2.3.1, pero cuando traté de cambiar a la versión 2.4.1, me enfrenté al problema:OpenCV 2.4.1: UnsatisfiedLinkError

Se compila sin ningún error, pero cuando inicio mi aplicación, puede ' t carga mi biblioteca debido a UnsatisfiedLinkError.

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

veo que Open CV intenta cargar libopencv_java.so, pero yo no lo necesito y yo no uso OpenCV en código Java. El tamaño de esta biblioteca> 5M.

¿Cómo compilar sin agregar esta lib a proyecto?

+0

Esto es en realidad la actualización de [mi pregunta] (http://stackoverflow.com/questions/10857301/unable-to-link-native-library-in-opencv-android-sample). ¿Estás seguro de que tu 'Android.mk' contiene la línea' OPENCV_LIB_TYPE: = STATIC'? – ArtemStorozhuk

+0

Marcó su pregunta como respondida, así que pensé que estaba bien incluir libopencv_java.so en su proyecto. Pero quiero excluirlo, si es posible. – Arseniy

+0

Sí, lo sé. Dije update no duplicate :) Entonces, ¿qué pasa con mi pregunta? – ArtemStorozhuk

Respuesta

7

libopencv_java.so además de envoltorios JNI en C++ La interfaz OpenCV contiene todos los códigos nativos de OpenCV.
Cuando se construye la biblioteca JNI con OpenCV 2.4 para Android Se puede enlazar dinámicamente con libopencv_java.so (opción por defecto) e incluirlo en su APK o enlazar estáticamente mediante la adición de esta opción de forma explícita:

include $(CLEAR_VARS) 
OPENCV_LIB_TYPE:=STATIC 
include <your path>/OpenCV.mk 
+3

Esto no funcionó para mí. Por ejemplo, muestra abierta de android de opencv # 3. Ver esta [pregunta] (http://stackoverflow.com/questions/10857301/unable-to-link-native-library-in-opencv-android-sample). – ArtemStorozhuk

+0

cambié mi código para usar un enlace dinámico de estilo nuevo. – Arseniy

1

una variación de los siguientes trabajado para mí cuando me actualizado desde 2.3 a 2.4 (seguir las instrucciones si usted tiene una parte de JNI en la aplicación de detalles en el enlace en la parte inferior..):

1/reemplazar las rutas de Android.mk para que el enlace OpenCV.mk todavía funciona (en 2.4 está en native/jni/en lugar de share/OpenCV /).

2/Luego escribir este antes de incluir OpenCV.mk:

OPENCV_INSTALL_MODULES:=on 
(this copies libopencv_java.so to your project's lib folder) 

puede copiar otras bibliotecas, así (por ejemplo OPENCV_CAMERA_MODULES tal como se utiliza en el enlace al final)

3/Después de eso, en la sección estática de la clase de actividad se puede cargar la biblioteca (biblioteca de carga antes de que otros que dependen de él):

System.loadLibrary("opencv_java"); 
(this loads libopencv.so) 

o:

if (!OpenCVLoader.initDebug()) { 
    // Handle initialization error 
}) 

(segunda parece más limpio pero no he probado todavía)

Fuente (por partes) es los pasos 3 y 4 en el enlace: Application Development with Static Initialization

+0

es posible que tenga que eliminar los intentos anteriores de cargar la biblioteca (por ejemplo, cargarlos en LOCAL_LDLIBS) – studiou

Cuestiones relacionadas