2012-06-05 20 views
6

Mam projekt Androida, który ma natywny kod. W tej natywnej części używam OpenCV. Wszystko kompiluje się i działa poprawnie, kiedy używam OpenCV 2.3.1, ale kiedy próbowałem przejść do wersji 2.4.1, stanąłem przed problemem:OpenCV 2.4.1: UnsatisfiedLinkError

Kompiluje się bez żadnych błędów, ale kiedy uruchamiam aplikację, może " t załaduj moją bibliotekę z powodu 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) 

widzę, że Otwarte CV próbuje załadować libopencv_java.so, ale ja tego nie potrzebuję i nie używam OpenCV w kodzie Java. Rozmiar tej biblioteki> 5M.

Jak skompilować bez dodawania tej biblioteki do projektu?

+0

To jest rzeczywiście aktualizować z [moje pytanie] (http://stackoverflow.com/questions/10857301/unable-to-link-native-library-in-opencv-android-sample). Czy na pewno twój 'Android.mk' zawiera wiersz' OPENCV_LIB_TYPE: = STATIC'? – ArtemStorozhuk

+0

Oznaczono jako odpowiedź na pytanie, więc pomyślałem, że możesz włączyć libopencv_java.so do swojego projektu. Ale jeśli to możliwe, chcę go całkowicie wykluczyć. – Arseniy

+0

Tak, wiem. Powiedziałem, że aktualizacja nie jest duplikatem :) A co z moim pytaniem? – ArtemStorozhuk

Odpowiedz

7

Oprócz wrapperów JNI do C++ OpenCV interfejs zawiera cały kod macierzysty OpenCV.
Podczas tworzenia biblioteki JNI z OpenCV 2.4 dla Androida to albo można związek dynamicznie z libopencv_java.so (opcja domyślna) i dołączyć go do swojej APK lub link statycznie dodając tę ​​opcję wyraźnie:

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

To nie działa dla mnie. Na przykład domyślna próbka adnroid opencv # 3. Zobacz to [pytanie] (http://stackoverflow.com/questions/10857301/unable-to-link-native-library-in-opencv-android-sample). – ArtemStorozhuk

+0

zmienił mój kod, aby używać dynamicznego łączenia w nowym stylu. – Arseniy

1

odmianą następujące pracował dla mnie, kiedy zmodernizowane od 2,3 do 2,4 (zgodnie z instrukcjami, jeśli masz część JNI w aplikacji Szczegóły w linku na dole..):

1/Wymień ścieżek w Android.mk, aby link OpenCV.mk nadal działa (w wersji 2.4 jest w macierzystym/jni/zamiast udziału/OpenCV /).

2/Następnie należy napisać to zanim to OpenCV.mk:

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

można kopiować innych bibliotek, jak również (np OPENCV_CAMERA_MODULES stosowany w link na dole)

3/Po tym, w statyczna część swojej klasie aktywny można załadować biblioteki (biblioteka obciążenia przed innymi, które zależą od IT):

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

czyli

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

(drugi wydaje się czystsze, ale nie próbowałem go jeszcze)

źródłowy (na części) znajduje się kilka kroków 3 i 4 w link: Application Development with Static Initialization

+0

konieczne może być usunięcie starych prób załadowania biblioteki (np. Załadowanie ich do LOCAL_LDLIBS) – studiou

Powiązane problemy