OpenCV per Android può sfruttare il supporto standard di C ++ per ottenere supporto di compilazione nativo su Android Studio 2.2 per Windows?

Ci sono molte domande e risposte sull’ottenere un’opportunità nativa per la costruzione di Android correttamente. Alcuni usano gradle, altri usano strumenti esterni. Queste numerose, complicate e spesso contrastanti descrizioni per le build native OpenCV potrebbero essere semplificate con un punto di partenza coerente; quando si crea un progetto Android Studio 2.2 Beta, esiste un modo per includere il supporto C ++: Includi supporto C ++ inserisci la descrizione dell'immagine qui

Questa funzionalità è stata aggiunta intorno al giugno 2016. Per ulteriori informazioni, consulta i documenti tecnici sugli strumenti Android .

Utilizzando Android Studio 2.2 o versioni successive con il plug-in Android per Gradle versione 2.2.0 o successiva, puoi aggiungere codice C e C ++ alla tua app compilandola in una libreria nativa che Gradle può pacchettizzare con il tuo APK. Il tuo codice Java può quindi chiamare le funzioni nella tua libreria nativa attraverso la Java Native Interface (JNI). Se vuoi saperne di più sull’utilizzo del framework JNI, leggi i suggerimenti JNI per Android.

Il controllo del Include C++ Support genera un file di build esterno chiamato 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} ) 

Per riconoscere un progetto Android che utilizza codice OpenCV nativo (C ++), il progetto includerà in genere un file *.cpp contenente JNIEXPORT voci JNIEXPORT insieme a implementazioni che utilizzano la funzionalità #include . Questo, a differenza dell’importazione del modulo OpenCV e della copia della cartella libs in jniLibs, che consente solo di chiamare la funzionalità OpenCV da Java.

È ansible utilizzare questo punto di partenza per configurare un’app di “Hello World” nativa di OpenCV, dimostrando che la build funziona?

INFORMAZIONI AGGIUNTIVE 8/22
Dato che questo enigma riguarda CMake e meno OpenCV, ho pensato di dare un punto di partenza per i progetti non interessati a OpenCV. È ansible ottenere il progetto del punto di partenza in modo ragionevolmente rapido utilizzando le informazioni in OpenCV in Android Studio .

Ecco un video di youtube che mostra la creazione di un nuovo progetto di Android Studio, l’importazione di OpenCV, la configurazione del build nativo in C ++, con conseguente applicazione “ciao mondo” di OpenCV uguale a quella di gitHub.

INFORMAZIONI AGGIUNTIVE 8/27
La versione impegnata oggi, basata sulla risposta di Bruno Alexandre Krinski , compila chiamate native OpenCV: https://github.com/sengsational/HelloCv . Esiste un problema separato relativo al messaggio “Installazione bloccata”, dove, al momento dell’installazione, Android avverte l’utente “Questa app contiene codice che tenta di aggirare le protezioni di sicurezza di Android.” Dal momento che non sono sicuro che questo sia un problema con la tecnica di costruzione, non espanderò questa domanda per includere quel problema (ma se qualcuno ha inserito questo problema, ti preghiamo di avvisare).

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

Sembra che tu abbia già importato il modulo opencv, ora apri il tuo CMakeList.txt e aggiungi le seguenti linee:

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

e modifica il:

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

per includere la tua lib_opencv che hai creato. Per finire, aggiungi la seguente linea:

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

nella tua app modulo, in questo modo:

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

e sotto di buildTypes si aggiunge:

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

Per maggiori dettagli, puoi vedere questo: https://github.com/googlesamples/android-ndk/tree/master/cmake/hello-libs

Con la configurazione di OpenCV 3.2 potrebbe essere in realtà piuttosto breve:

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

Cioè, 4 righe e non c’è bisogno di copiare nulla nel tuo progetto. Assicurati che OPENCV_HOME punti alla directory in cui si trova OpenCV Android SDK.

Un ulteriore vantaggio di questo approccio: è ansible colbind staticamente OpenCV, riducendo drasticamente le dimensioni dell’app / libreria.

Uso questo approccio in uno dei progetti Github: https://github.com/Fotoapparat/FaceDetector