2012-06-05 3 views
6

J'ai un projet android, qui a du code natif. Dans cette partie native, j'utilise OpenCV. Tout compile et fonctionne bien quand j'utilise OpenCV 2.3.1, mais quand j'ai essayé de passer à la version 2.4.1, j'ai rencontré le problème:OpenCV 2.4.1: UnsatisfiedLinkError

Il compile sans erreur, mais quand je démarre mon application, il peut ' t charger ma bibliothèque à cause de 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) 

Je vois que l'Open CV tente de charger libopencv_java.so, mais je ne ont pas besoin et je ne pas utiliser OpenCV dans le code java. La taille de cette bibliothèque> 5M.

Comment compiler sans ajouter cette bibliothèque au projet?

+0

Ceci est en fait la mise à jour de [ma question] (http://stackoverflow.com/questions/10857301/unable-to-link-native-library-in-opencv-android-sample). Êtes-vous sûr que votre 'Android.mk' contient la ligne' OPENCV_LIB_TYPE: = STATIC'? – ArtemStorozhuk

+0

Vous avez marqué votre question comme réponse, alors j'ai pensé que vous pouviez inclure libopencv_java.so dans votre projet. Mais je veux l'exclure du tout, si possible. – Arseniy

+0

Oui, je sais. J'ai dit mise à jour pas dupliquer :) Alors, qu'en est-il de ma question? – ArtemStorozhuk

Répondre

7

Le libopencv_java.so en plus des wrappers JNI à l'interface C++ OpenCV contient tout le code natif OpenCV.
Lorsque vous construisez votre bibliothèque JNI avec OpenCV 2.4 pour Android, vous pouvez soit dynamiquement lien avec libopencv_java.so (option par défaut) et l'inclure dans votre APK ou un lien statiquement en ajoutant explicitement cette option:

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

Cela n'a pas fonctionné pour moi. Par exemple, l'exemple # 3 d'opencv adnroid par défaut. Voir cette [question] (http://stackoverflow.com/questions/10857301/unable-to-link-native-library-in-opencv-android-sample). – ArtemStorozhuk

+0

a changé mon code pour utiliser la nouvelle liaison dynamique. – Arseniy

1

une variante de ce qui suit travaillé pour moi quand je suis passé de 2,3 à 2,4 (suivre les instructions si vous avez une partie JNI dans votre application Détails dans le lien en bas..):

1/Remplacer les chemins dans Android.mk pour que le lien OpenCV.mk fonctionne toujours (dans 2.4 il est en natif/jni/au lieu de share/OpenCV /).

2/Ensuite, écrivez ceci avant d'inclure OpenCV.mk:

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

vous pouvez copier d'autres bibliothèques ainsi (par exemple OPENCV_CAMERA_MODULES tel qu'il est utilisé dans le lien en bas)

3/Après cela, en la section statique de votre classe d'activité, vous pouvez charger la bibliothèque (bibliothèque de charge avant les autres qui en dépendent):

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

ou:

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

(deuxième semble plus propre, mais je n'ai pas encore essayé)

Source (pour les pièces) est les étapes 3 et 4 en lien: Application Development with Static Initialization

+0

vous devrez peut-être supprimer les anciennes tentatives de chargement de la bibliothèque (par exemple, les charger dans LOCAL_LDLIBS) – studiou

Questions connexes