Может ли OpenCV для Android использовать стандартную поддержку С++ для поддержки встроенной сборки на Android Studio 2.2 для Windows?

Есть много вопросов и ответов, связанных с тем, чтобы получить собственный 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)

Ответ 1

Кажется, вы уже импортировали opencv-модуль, теперь откройте свой CMakeList.txt и добавьте следующие строки:

set(CMAKE_VERBOSE_MAKEFILE on)

add_library(lib_opencv SHARED IMPORTED)

set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION
path to your project/MyApplication/app/src/main/jniLibs/${ANDROID_ABI} libopencv_java3.so)


include_directories(path to opencv directory/OpenCV-android-sdk/sdk/native/jni/include)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")

и отредактируйте:

target_link_libraries( # Specifies the target library.
                   native-lib
                   lib_opencv
                   # Links the target library to the log library
                   # included in the NDK.
                   $\{log-lib} )

включить ваш lib_opencv, который вы создали. Чтобы закончить, вы добавляете следующую строку:

abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'mips', 'mips64'

в вашем приложении модуля, например:

externalNativeBuild {

    cmake {
        cppFlags "-std=c++11 -frtti -fexceptions"
        abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'mips', 'mips64'
    }
}

и ниже добавляемых типов buildTypes:

sourceSets {
    main {
        jniLibs.srcDirs = ['path to your application /MyApplication/app/src/main/jniLibs/']
    }
}

Для получения дополнительной информации вы можете увидеть это: https://github.com/googlesamples/android-ndk/tree/master/cmake/hello-libs

Ответ 2

Конфигурация OpenCV 3.2 может быть довольно короткой:

set(OpenCV_STATIC ON)
set(OpenCV_DIR ${OPENCV_HOME}/sdk/native/jni)
find_package (OpenCV REQUIRED)

target_link_libraries(native-lib ${OpenCV_LIBS})

Вот и все, 4 строки и не нужно ничего копировать в ваш проект. Просто убедитесь, что OPENCV_HOME указывает на каталог, где расположен OpenCV Android SDK.

Еще одно преимущество этого подхода - вы можете связать с OpenCV статически, что резко снизит размер вашего приложения/библиотеки.