2012-06-05 15 views
6

Ho un progetto Android, che ha un codice nativo. In questa parte nativa uso OpenCV. Tutto ciò che compila e funziona bene quando uso OpenCV 2.3.1, ma quando ho provato a passare alla versione 2.4.1, ho riscontrato un problema:OpenCV 2.4.1: UnsatisfiedLinkError

Compila senza errori, ma quando avvio la mia app, puo ' t carica la mia libreria a causa di 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) 

vedo che l'Open CV tenta di caricare libopencv_java.so, ma io non ne hanno bisogno e non uso OpenCV in codice Java. Dimensione della libreria> 5 M.

Come compilare senza aggiungere questa lib al progetto?

+0

Questo è in realtà l'aggiornamento di [mia domanda] (http://stackoverflow.com/questions/10857301/unable-to-link-native-library-in-opencv-android-sample). Sei sicuro che il tuo 'Android.mk' contenga la riga' OPENCV_LIB_TYPE: = STATIC'? – ArtemStorozhuk

+0

Hai contrassegnato la domanda come risposta, quindi ho pensato che fosse opportuno includere libopencv_java.so nel tuo progetto. Ma voglio escluderlo del tutto, se possibile. – Arseniy

+0

Sì, lo so. Ho detto aggiornamento non duplicato :) Quindi, per quanto riguarda la mia domanda? – ArtemStorozhuk

risposta

7

Il libopencv_java.so in aggiunta ai wrapper JNI all'interfaccia C++ OpenCV contiene tutto il codice nativo OpenCV.
Quando si genera la libreria JNI con OpenCV 2.4 per Android è possibile sia collegamento dinamicamente con libopencv_java.so (opzione di default) e di includere nella tua APK o collegamento staticamente con l'aggiunta di questa opzione in modo esplicito:

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

Questo non ha funzionato per me. Ad esempio, esempio predefinito 3 esempio. Vedi questa [domanda] (http://stackoverflow.com/questions/10857301/unable-to-link-native-library-in-opencv-android-sample). – ArtemStorozhuk

+0

ha cambiato il mio codice per utilizzare il collegamento dinamico di nuovo stile. – Arseniy

1

una variazione dei seguenti lavorato per me quando ho aggiornato 2,3-2,4 (seguire le istruzioni se si dispone di una parte JNI nell'applicazione dettagli in link in fondo..):

1/sostituire i percorsi in Android.mk così il collegamento OpenCV.mk funziona ancora (in 2.4 è in native/jni/invece di share/OpenCV /).

2/Poi scrivere questo prima di includere OpenCV.mk:

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

è possibile copiare altre librerie come bene (ad esempio OPENCV_CAMERA_MODULES come usato in link in fondo)

3/Dopo di che, in la sezione statica della classe di attività è possibile caricare la libreria (libreria di caricamento prima di altri che dipendono da esso):

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

o:

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

(seconda sembra più pulita ma non ho ancora provato)

Fonte (per le parti) è i punti 3 e 4 a link: Application Development with Static Initialization

+0

potrebbe essere necessario eliminare i vecchi tentativi di caricare la libreria (ad esempio caricandoli in LOCAL_LDLIBS) – studiou

Problemi correlati