OpenCV 2.4.1: UnsatisfiedLinkError

Am un proiect Android, care are cod nativ. În această parte nativă folosesc OpenCV. Totul se compilează și funcționează OK când folosesc OpenCV 2.3.1, dar când am încercat să trec la versiunea 2.4.1, m-am confruntat cu o problemă:

Compilează fără erori, dar când pornesc aplicația, nu îmi poate încărca biblioteca din cauza 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)

Văd că Open CV încearcă să încarce libopencv_java.so, dar nu am nevoie de el și nu folosesc OpenCV în codul java. Dimensiunea acestei biblioteci >5M.

Cum se compila fără a adăuga această lib la proiect?


person Arseniy    schedule 05.06.2012    source sursă
comment
Aceasta este de fapt o actualizare a întrebarea mea. Ești sigur că Android.mk conține linia OPENCV_LIB_TYPE:=STATIC?   -  person ArtemStorozhuk    schedule 05.06.2012
comment
Ați marcat întrebarea ca răspuns, așa că am crezut că este în regulă pentru dvs. să includeți libopencv_java.so în proiectul dvs. Dar vreau să-l exclud deloc, dacă se poate.   -  person Arseniy    schedule 05.06.2012
comment
Da, știu. Am spus că actualizarea nu este duplicată :) Deci, cum rămâne cu întrebarea mea?   -  person ArtemStorozhuk    schedule 05.06.2012
comment
Nu există OPENCV_LIB_TYPE:=STATIC în Android.mk al meu, dar este în regulă când folosesc OpenCV 2.3.1   -  person Arseniy    schedule 05.06.2012
comment
Încercați să-l adăugați. Probabil asta o va rezolva. Consultați acest răspuns.   -  person ArtemStorozhuk    schedule 05.06.2012
comment
Mulțumesc, voi încerca asta. Nu îl pot compila acum, pentru că primesc undefined reference to cv::calcOpticalFlowPyrLK. Se pare ca fac ceva gresit..   -  person Arseniy    schedule 05.06.2012
comment
permiteți-ne să continuăm această discuție în chat   -  person Arseniy    schedule 05.06.2012


Răspunsuri (2)


libopencv_java.so, pe lângă învelișurile JNI la interfața C++ OpenCV, conține tot codul nativ OpenCV.
Când vă construiți biblioteca JNI cu OpenCV 2.4 pentru Android, puteți fie conecta dinamic< /strong> cu libopencv_java.so (opțiune implicită) și includeți-l în APK-ul dvs. sau conectați-l static adăugând această opțiune în mod explicit:

include $(CLEAR_VARS)
OPENCV_LIB_TYPE:=STATIC
include <your path>/OpenCV.mk
person OpenCV4Android    schedule 05.06.2012
comment
Acest lucru nu a funcționat pentru mine. De exemplu, mostra implicită opencv adnroid #3. Consultați această întrebare. - person ArtemStorozhuk; 05.06.2012

O variantă a următoarelor a funcționat pentru mine când am făcut upgrade de la 2.3 la 2.4 (urmați instrucțiunile dacă aveți o parte JNI în aplicație. Detalii în linkul de jos.):

1/ Înlocuiți căile în Android.mk, astfel încât linkul OpenCV.mk să funcționeze în continuare (în 2.4 este în nativ/jni/ în loc de share/OpenCV/).

2/ Apoi scrieți asta înainte de a include OpenCV.mk:

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

puteți copia și alte biblioteci (de exemplu, OPENCV_CAMERA_MODULES așa cum este folosit în linkul de jos)

3/ După aceea, în secțiunea statică a clasei de activitate puteți încărca biblioteca (încărcați biblioteca înaintea altora care depind de ea):

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

or:

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

(al doilea pare mai curat, dar nu l-am încercat încă)

Sursa (pentru părți) este pașii 3 și 4 din link: Dezvoltare de aplicații cu inițializare statică

person studiou    schedule 26.06.2013
comment
poate fi necesar să ștergeți încercările vechi de încărcare a bibliotecii (de exemplu, încărcarea lor în LOCAL_LDLIBS) - person studiou; 26.06.2013