windows android-studio cmake jni opencv4android

¿Puede OpenCV para Android aprovechar el soporte estándar de C++ para obtener soporte de compilación nativo en Android Studio 2.2 para Windows?



android-studio cmake (4)

Hay muchas preguntas y respuestas acerca de cómo obtener la apertura nativa para la construcción de Android correctamente. Algunos usan gradle, otros usan herramientas externas. Estas descripciones numerosas, complicadas y, a menudo, conflictivas para compilaciones nativas de OpenCV podrían simplificarse con un punto de partida consistente; al crear un proyecto beta de Android Studio 2.2, hay una manera de incluir soporte de C ++:

Esta función se agregó alrededor de junio de 2016. Consulte la documentación técnica de las herramientas de Android para obtener más información.

Al utilizar Android Studio 2.2 o superior con el complemento de Android para Gradle versión 2.2.0 o superior, puede agregar códigos C y C ++ a su aplicación al compilarlos en una biblioteca nativa que Gradle puede empaquetar con su APK. Su código Java puede luego llamar a funciones en su biblioteca nativa a través de la interfaz nativa de Java (JNI). Si desea obtener más información sobre el uso del marco JNI, lea las sugerencias de JNI para Android.

La comprobación de la Include C++ Support genera un archivo de compilación externo llamado 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} )

Para reconocer un proyecto de Android que usa código OpenCV nativo (C ++), el proyecto incluirá normalmente un archivo *.cpp que contiene entradas JNIEXPORT junto con implementaciones que usan la funcionalidad #include <opencv...hpp> . Esto, a diferencia de importar el módulo OpenCV y copiar la carpeta libs en jniLibs, que solo permite llamar a la funcionalidad OpenCV desde Java.

¿Es posible utilizar este punto de partida para configurar una aplicación nativa de "hola mundo" de OpenCV, demostrando que la compilación está funcionando?

INFORMACIÓN ADICIONAL 8/22
Dado que este enigma trata sobre CMake y menos sobre OpenCV, pensé que daría un punto de inicio del proyecto para aquellos que no están interesados ​​en OpenCV. Podría hacer que el proyecto del punto de partida se realice de forma razonablemente rápida utilizando la información de OpenCV en Android Studio .

Aquí hay un video de youtube que muestra la creación de un nuevo proyecto de Android Studio, importando OpenCV, configurando la versión nativa de C ++, lo que resulta en la aplicación "hello world" de OpenCV que es igual a la de gitHub.

INFORMACIÓN ADICIONAL 8/27
La versión comprometida hoy, basada en la respuesta de Bruno Alexandre Krinski , compila las llamadas nativas de OpenCV: https://github.com/sengsational/HelloCv . Hay un problema aparte relacionado con el mensaje "Instalación bloqueada", donde, después de la instalación, Android advierte al usuario "Esta aplicación contiene código que intenta omitir las protecciones de seguridad de Android". Como no estoy seguro de que este sea un problema con la técnica de compilación, no ampliaré esta pregunta para incluir ese problema (pero si alguien tiene una opinión sobre ese problema, por favor avise).

#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)


Con OpenCV 3.2 la configuración podría ser bastante corta:

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

Eso es todo, 4 líneas y no es necesario copiar nada en tu proyecto. Solo asegúrese de que OPENCV_HOME apunte al directorio donde se encuentra OpenCV Android SDK.

Un beneficio adicional de este enfoque: puede vincularse con OpenCV de forma estática, lo que reduciría drásticamente el tamaño de su aplicación / biblioteca.

Utilizo este enfoque en uno de los proyectos de Github: https://github.com/Fotoapparat/FaceDetector


Haz lo mismo que la respuesta de Bruno Alexandre Krinski pero

en lugar de esta linea

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

pon esta línea, (no sé por qué esto me funcionó)

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

(Siga todas las instrucciones de la respuesta anterior, excepto esta)


Parece que ya ha importado el módulo opencv, ahora, abra su CMakeList.txt y agregue las siguientes líneas:

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")

y editar el:

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} )

para incluir su lib_opencv que ha creado. Para finalizar, agregue la siguiente línea:

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

en tu aplicación de módulo, así:

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

y debajo de buildTypes agregas:

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

Para obtener más detalles, puede ver esto: https://github.com/googlesamples/android-ndk/tree/master/cmake/hello-libs


ABIs [armeabi] no son compatibles con la plataforma Android

Los ABI soportados son [arm64-v8a, armeabi-v7a, x86, x86_64].

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