Android NDK + OpenCV 2.4.1

Подключаем OpenCV 2.4.1 к нативной части Android-проекта. OpenCV — это богатая функциональностью в области компьютерного зрения (CV, Computer Vision) библиотека с открытым исходным кодом.

Предварительные приготовления

Предполагаем что Android SDK и NDK установлены, проект уже создан, JNI-часть уже создана и компилируется, иными словами, мы готовы добавить в проект OpenCV. Следует заметить, что можно собрать OpenCV из исходников самим, но в этой статье мы воспользуемся уже собранными бинарниками. Если вы этого еще не сделали, предлагаю вам скачать OpenCV с сайта разработчиков.

Конфигурация make-файлов

Создайте файл <project>/jni/Application.mk содержащий:

PP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a

Измените уже созданный <project>/jni/Android.mk:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
OPENCV_CAMERA_MODULES := off
OPENCV_INSTALL_MODULES := on
include $(OPENCV_DIR)/share/opencv/OpenCV.mk
LOCAL_MODULE := <modulename>
LOCAL_SRC_FILES := <*.cpp files>
LOCAL_LDLIBS += -llog -ldl
include $(BUILD_SHARED_LIBRARY)

Если вам нужны модули libnative_camera*.so (а они нужны для того чтобы использовать камеру устройства прямо в нативном коде), тогда следует включить

OPENCV_CAMERA_MODULES := on

Чтобы пользоваться автодополнением, добавьте путь <OPENCV_DIR>/include в список путей, в которых IDE ищет заголовочные файлы.

Компиляция кода в динамической связке с OpenCV

Воспользуемся утилитой ndk-build, которая теперь, кроме сборки вашего кода, должна копировать библиотеку libopencv_java.so в директорию <project>/libs (за это отвечает параметр OPENCV_INSTALL_MODULES в Android.mk), так как ваша нативная библиотека зависит от нее. Если был включен параметр OPENCV_CAMERA_MODULES, то так-же будут скопированы библиотеки libnative_camera*.so

Загрузка opencv_java в коде Java

После того как нативная часть собрана, остался маленький шаг: перед загрузкой вашей библиотеки, необходимо загрузить библиотеку opencv_java. Если этого не сделать, то при загрузке своей библиотеки мы получим UnsatisfiedLinkError, потому что ваш код динамически связан с libopencv_java.so, однако автоматически она не загружается. Итак:

static {
  System.loadLibrary("opencv_java");
  System.loadLibrary("<modulename>");  //modulename- имя вашего модуля
}

Теперь можно собирать Android-проект, который будет включать в себя динамически связанную библиотеку OpenCV.

Спасибо что читаете!

Запись опубликована в рубрике Туториалы с метками , , , , . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *