2012-06-05 4 views
6

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

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

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

+0

На самом деле это обновление из [мой вопрос] (http://stackoverflow.com/questions/10857301/unable-to-link-native-library-in-opencv-android-sample). Вы уверены, что ваш 'Android.mk' содержит строку' OPENCV_LIB_TYPE: = STATIC'? – ArtemStorozhuk

+0

Вы ответили как на вопрос, поэтому я подумал, что вам нужно включить libopencv_java.so в ваш проект. Но я хочу вообще исключить его, если это возможно. – Arseniy

+0

Да, я знаю. Я сказал, что обновление не дублируется :) Итак, как насчет моего вопроса? – ArtemStorozhuk

ответ

7

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

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

Это не сработало для меня. Например, стандартный образец openv adnroid №3. См. Этот [вопрос] (http://stackoverflow.com/questions/10857301/unable-to-link-native-library-in-opencv-android-sample). – ArtemStorozhuk

+0

изменил мой код, чтобы использовать динамическое связывание нового стиля. – Arseniy

1

Разновидностью следующие работал для меня, когда я повышен с 2,3 до 2,4 (следуйте инструкциям, если у вас есть часть JNI в приложении Подробности в ссылке на дне..):

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/После этого, в статическая часть вашего класса активности вы можете загрузить библиотеку (библиотеку нагрузки перед другими, которые зависят от него):

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

или:

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

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

Источник (для деталей) находится в нескольких шагах 3 и 4 в ссылке: Application Development with Static Initialization

+0

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

Смежные вопросы