OpenCV 2.4.1: ошибка неудовлетворенной ссылки

У меня есть проект Android с собственным кодом. В этой нативной части я использую OpenCV. Все компилируется и работает нормально, когда я использую OpenCV 2.3.1, но когда я попытался перейти на версию 2.4.1, я столкнулся с проблемой:

Он компилируется без каких-либо ошибок, но когда я запускаю свое приложение, оно не может загрузить мою библиотеку из-за ошибки 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)

Я вижу, что Open CV пытается загрузить libopencv_java.so, но мне это не нужно, и я не использую OpenCV в java-коде. Размер этой библиотеки> 5M.

Как скомпилировать без добавления этой библиотеки в проект?


person Arseniy    schedule 05.06.2012    source источник
comment
На самом деле это обновление моего вопроса. Вы уверены, что ваш Android.mk содержит строку OPENCV_LIB_TYPE:=STATIC?   -  person ArtemStorozhuk    schedule 05.06.2012
comment
Вы отметили свой вопрос как ответ, поэтому я подумал, что вы можете включить libopencv_java.so в свой проект. Но я хочу исключить его вообще, если это возможно.   -  person Arseniy    schedule 05.06.2012
comment
Да, я знаю. Я сказал обновить, а не дублировать :) Итак, как насчет моего вопроса?   -  person ArtemStorozhuk    schedule 05.06.2012
comment
В моем Android.mk нет OPENCV_LIB_TYPE:=STATIC, но все в порядке, когда я использую OpenCV 2.3.1   -  person Arseniy    schedule 05.06.2012
comment
Попробуйте добавить его. Это, вероятно, исправит это. См. этот ответ.   -  person ArtemStorozhuk    schedule 05.06.2012
comment
Спасибо, я попробую это. Я не могу скомпилировать его прямо сейчас, потому что я получаю undefined reference to cv::calcOpticalFlowPyrLK. Похоже я что-то не так делаю..   -  person Arseniy    schedule 05.06.2012
comment
давайте продолжим обсуждение в чате   -  person Arseniy    schedule 05.06.2012


Ответы (2)


libopencv_java.so в дополнение к оболочкам JNI для интерфейса C++ OpenCV содержит весь собственный код OpenCV.
Когда вы создаете свою библиотеку JNI с помощью OpenCV 2.4 для Android, вы можете связать ее динамически< /strong> с libopencv_java.so (параметр по умолчанию) и включите его в свой APK или свяжите статически, явно добавив этот параметр:

include $(CLEAR_VARS)
OPENCV_LIB_TYPE:=STATIC
include <your path>/OpenCV.mk
person OpenCV4Android    schedule 05.06.2012
comment
Это не сработало для меня. Например, образец opencv adnroid по умолчанию № 3. См. этот вопрос. - person ArtemStorozhuk; 05.06.2012

Когда я обновился с 2.3 до 2.4, у меня сработал вариант следующего:

1/ Замените пути в Android.mk, чтобы ссылка OpenCV.mk все еще работала (в 2.4 она находится в native/jni/ вместо share/OpenCV/).

2/Затем напишите это, прежде чем включать OpenCV.mk:

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

вы также можете скопировать другие библиотеки (например, OPENCV_CAMERA_MODULES, как используется в ссылке внизу)

3/После этого в статическом разделе вашего класса Activity вы можете загрузить библиотеку (загрузить библиотеку перед другими, которые зависят от нее):

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

or:

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

(второй кажется чище, но я еще не пробовал)

Источник (для частей) - это шаги 3 и 4 по ссылке: Разработка приложений со статической инициализацией

person studiou    schedule 26.06.2013
comment
вам может потребоваться удалить старые попытки загрузить библиотеку (например, загрузить их в LOCAL_LDLIBS) - person studiou; 26.06.2013