Czy OpenCV dla Androida może korzystać ze standardowej obsługi C++, aby uzyskać natywną obsługę kompilacji w Android Studio 2.2 Dla Windows?

Istnieje wiele pytań i odpowiedzi dotyczących poprawnego budowania natywnego opencv dla Androida. Niektórzy używają gradle, inni zewnętrznych narzędzi. Te liczne, skomplikowane i często sprzeczne opisy natywnych kompilacji OpenCV mogą zostać uproszczone ze spójnym punktem wyjścia; podczas tworzenia projektu Android Studio 2.2 Beta istnieje sposób na włączenie obsługi C++ : Dołącz Obsługę C++Tutaj wpisz opis obrazka

Ta funkcja została dodana około czerwca 2016 roku. Zobacz Android tools technical docs aby uzyskać więcej informacji.

Używając Android Studio 2.2 lub nowszego z wtyczką Android dla Gradle w wersji 2.2.0 lub nowszej, możesz dodać kod C i C++ do swojej aplikacji, kompilując go do natywnej biblioteki, którą Gradle może spakować z Twoim APK. Kod Java może następnie wywoływać funkcje w macierzystej bibliotece za pośrednictwem interfejsu Java Native Interface (JNI). Jeśli chcesz dowiedzieć się więcej na temat korzystania z JNI framework, przeczytaj wskazówki JNI dla Androida.

Sprawdzenie Include C++ Support generuje zewnętrzny plik kompilacji o nazwie 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} )

Aby rozpoznać projekt na Androida, który używa natywnego (C++) kodu OpenCV, projekt zazwyczaj zawiera plik *.cpp zawierający wpisy JNIEXPORT wraz z implementacjami wykorzystującymi funkcjonalność #include <opencv...hpp>. To, w przeciwieństwie do importowania modułu OpenCV i kopiowania folderu libs do jniLibs, co pozwala tylko na wywołanie funkcji OpenCV z Javy.

Czy możliwe jest użycie tego punkt wyjścia do skonfigurowania natywnej aplikacji "hello world" OpenCV, udowadniając, że kompilacja działa?

INFORMACJE DODATKOWE 8/22
Ponieważ ta zagadka jest o CMake i mniej o OpenCV, pomyślałem, że dam punkt startowy dla tych, którzy nie są zainteresowani OpenCV. Możesz szybko uruchomić projekt punktu wyjścia, korzystając z informacji w OpenCV W Android Studio.

Oto youtube video to pokazuje stworzenie nowego projektu Android Studio, importowanie OpenCV, konfigurowanie natywnej kompilacji C++, w wyniku czego aplikacja OpenCV "hello world" jest równa aplikacji w GitHubie.

INFORMACJE DODATKOWE 8/27
Wersja zatwierdzona dzisiaj, na podstawie odpowiedzi Bruno Alexandre Krinski kompiluje natywne wywołania OpenCV: https://github.com/sengsational/HelloCv . Istnieje osobny problem dotyczący komunikatu "instalacja zablokowana", gdzie, po instalacji Android ostrzega użytkownika "Ta aplikacja zawiera kod, który próbuje ominąć zabezpieczenia Androida."Ponieważ nie jestem pewien, czy jest to problem z techniką budowania, Nie będę rozszerzał tego pytania o ten problem (ale jeśli ktoś ma wkład w ten problem, proszę o poradę).

#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)
Author: Community, 2016-08-15

4 answers

Wygląda na to, że już zaimportowałeś moduł opencv, teraz otwórz swoją CMakeList.txt i dodaj następujące linie:

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

I edytuj:

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

Aby dołączyć utworzony przez Ciebie lib_opencv. Aby zakończyć, dodajesz następujący wiersz:

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

W Twojej aplikacji modułu, tak:

externalNativeBuild {

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

I poniżej buildtyp ' ów dodajesz:

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

Aby uzyskać więcej szczegółów, możesz zobaczyć to: https://github.com/googlesamples/android-ndk/tree/master/cmake/hello-libs

 26
Author: Bruno Alexandre Krinski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-27 11:58:26

Z OpenCV 3.2 konfiguracja może być dość krótka:

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

target_link_libraries(native-lib ${OpenCV_LIBS})

To jest to, 4 linie i nie ma potrzeby kopiowania czegokolwiek do projektu. Upewnij się tylko, że OPENCV_HOME wskazuje na katalog, w którym znajduje się OpenCV Android SDK.

Dodatkowa zaleta tego podejścia - możesz łączyć się statycznie z OpenCV, co znacznie zmniejszy rozmiar twojej aplikacji/biblioteki.

Używam tego podejścia w jednym z projektów Github: https://github.com/Fotoapparat/FaceDetector

 8
Author: Dmitry Zaytsev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-11 12:07:09

Zrób to samo, co odpowiedź Bruno Alexandre ' a Krinskiego, ale

W Miejsce tej linii

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

Put this line, (I don ' t know why this work for me)

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

(postępuj zgodnie z instrukcjami powyższej odpowiedzi z wyjątkiem tej)

 0
Author: Pranav Baurasia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-13 10:38:25

ABIs [armeabi] nie są obsługiwane dla Platformy Android

Obsługiwane ABIs to [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'
            }
        }
 0
Author: Shomu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-26 10:41:55