Есть много вопросов и ответов, связанных с тем, чтобы получить собственный opencv для построения Android. Некоторые используют gradle, другие используют внешние инструменты. Эти многочисленные, сложные и часто противоречивые описания для собственных сборников OpenCV могут быть упрощены с последовательной отправной точкой; при создании бета-проекта Android Studio 2.2 есть способ включить поддержку С++:
Эта функция была добавлена около июня 2016 года. Подробнее см. технические инструменты Android.
Используя Android Studio 2.2 или более поздней версии с Android-плагином для Gradle версии 2.2.0 или выше, вы можете добавить код C и С++ в свое приложение, скомпилировав его в родную библиотеку, которую Gradle может упаковать с вашим APK, Затем ваш Java-код может вызывать функции в вашей родной библиотеке через интерфейс Java Native Interface (JNI). Если вы хотите узнать больше об использовании инфраструктуры JNI, прочитайте советы JNI для Android.
Проверка Include C++ Support
создает файл внешней сборки с именем CMakeLists.txt
.
# Sets the minimum version of CMake required to build the native
# library. You should either keep the default value or only pass a
# value of 3.4.0 or lower.
cmake_minimum_required(VERSION 3.4.1)
# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds it for you.
# Gradle automatically packages shared libraries with your APK.
add_library( # Sets the name of the library.
native-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
# Associated headers in the same location as their source
# file are automatically included.
src/main/cpp/native-lib.cpp )
# Searches for a specified prebuilt library and stores the path as a
# variable. Because system libraries are included in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.
find_library( # Sets the name of the path variable.
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log )
# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in the
# build script, prebuilt third-party libraries, or system libraries.
target_link_libraries( # Specifies the target library.
native-lib
# Links the target library to the log library
# included in the NDK.
$\{log-lib} )
Чтобы распознать проект Android, который использует собственный код OpenCV (С++), проект обычно включает файл *.cpp
, содержащий записи JNIEXPORT
, а также реализации, которые используют функциональность #include <opencv...hpp>
. Это, в отличие от импорта модуля OpenCV и копирования папки libs в jniLibs, что позволяет только вызывать функции OpenCV из Java.
Можно ли использовать эту отправную точку для настройки приложения OpenCV native hello world, доказывая, что сборка работает?
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ 8/22
Поскольку эта головоломка о CMake
и меньше о OpenCV, я думал, что я дам начальную точку проекта для тех, кто не интересуется OpenCV. Вы можете быстро запустить проект начальной точки, используя информацию в OpenCV в Android Studio.
Вот youtube video, в котором показано создание нового проекта Android Studio, импорт OpenCV, настройка native С++ build, в результате чего приложение OpenCV "hello world" совпадает с приложением в gitHub.
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ 8/27
Сегодняшняя версия, основанная на ответе от Bruno Alexandre Krinski , компилирует собственные вызовы OpenCV: https://github.com/sengsational/HelloCv. Существует отдельная проблема, связанная с сообщением об установке "Заблокировано", где после установки Android предупреждает пользователя "Это приложение содержит код, который пытается обойти защиту безопасности Android". Поскольку я не уверен, что это проблема с технологией сборки, я не буду расширять этот вопрос, чтобы включить эту проблему (но если у кого-то есть данные по этой проблеме, пожалуйста, сообщите).
#Added 2 path definitions to support 20160825 additions
set(pathToProject C:/Users/Owner/AndroidStudioProjects/HelloCv)
set(pathToOpenCv C:/Users/Owner/OpenCV-3.1.0-android-sdk)
#Added by the IDE on project create
cmake_minimum_required(VERSION 3.4.1)
#Two sets suggested by Bruno Alexandre Krinski 20160825
set(CMAKE_VERBOSE_MAKEFILE on)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
#Addition suggested by Bruno Alexandre Krinski 20160825
include_directories(${pathToOpenCv}/sdk/native/jni/include)
#Added by IDE on project create
add_library( native-lib SHARED src/main/cpp/native-lib.cpp )
#Addition suggested by Bruno Alexandre Krinski 20160825
add_library( lib_opencv SHARED IMPORTED )
#Addition suggested by Bruno Alexandre Krinski 20160825
set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION ${pathToProject}/app/src/main/jniLibs/${ANDROID_ABI}/libopencv_java3.so)
#Added by IDE on project create
find_library( log-lib log )
#Added by IDE on project create, Removed and replace with additional parameter suggested by Bruno Alexandre Krinski 20160825
#target_link_libraries( native-lib $\{log-lib} )
target_link_libraries( native-lib $\{log-lib} lib_opencv)