Pytanie Czy OpenCV dla systemu Android może korzystać ze standardowej obsługi języka C ++, aby uzyskać wsparcie dla rodzimej wersji w systemie Android Studio 2.2 dla systemu Windows?


Istnieje wiele pytań i odpowiedzi dotyczących uzyskiwania rodzimego opencv dla budowania Androida poprawnie. Niektórzy używają gradle, inni używają zewnętrznych narzędzi. Te liczne, skomplikowane i często sprzeczne opisy dla rodzimych wersji OpenCV mogą zostać uproszczone dzięki spójnemu punktowi wyjścia; podczas tworzenia projektu Android Studio 2.2 Beta istnieje sposób na włączenie obsługi C ++: Include C++ Supportenter image description here

Ta funkcja została dodana około czerwca 2016 r. Zobacz Dokumentacja techniczna narzędzi Androida po więcej informacji.

Korzystając z Androida Studio 2.2 lub nowszego z wtyczką do systemu Android w wersji Gradle w wersji 2.2.0 lub nowszej, możesz dodać kod C i C ++ do swojej aplikacji, kompilując ją do rodzimej biblioteki, którą Gradle może spakować z plikiem APK. Twój kod Java może następnie wywoływać funkcje w twojej macierzystej bibliotece przez Java Native Interface (JNI). Jeśli chcesz dowiedzieć się więcej o korzystaniu ze środowiska JNI, przeczytaj porady JNI dla Androida.

Sprawdzanie 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 Androida, który korzysta z natywnego (C ++) kodu OpenCV, projekt będzie zwykle zawierał *.cpp plik zawierający JNIEXPORT wpisy wraz z używanymi implementacjami #include <opencv...hpp> funkcjonalność. To, w przeciwieństwie do importowania modułu OpenCV i kopiowania folderu libs do jniLibs, który pozwala tylko wywoływać funkcjonalność OpenCV z Java.

Czy można użyć tego punktu wyjścia do skonfigurowania natywnej aplikacji "witaj świecie" OpenCV, potwierdzając, że działa?

DODATKOWE INFORMACJE 8/22
Skoro chodzi o tę zagadkę CMake a mniej o OpenCV, myślałem, że dam punkt wyjścia dla tych, którzy nie są zainteresowani OpenCV. Możesz szybko rozpocząć projekt punktu wyjścia, korzystając z informacji w nim zawartych OpenCV w Android Studio.

Tutaj jest film youtube to pokazuje stworzenie nowego projektu Android Studio, importowanie OpenCV, konfigurowanie natywnej wersji C ++, w wyniku czego aplikacja OpenCV "hello world" jest równa tej z gitHub.

DODATKOWE INFORMACJE 8/27
Wersja, która została dzisiaj zatwierdzona, na podstawie odpowiedzi Bruno Alexandre Krinski kompiluje natywne połączenia OpenCV: https://github.com/sengsational/HelloCv . Istnieje osobny problem dotyczący komunikatu "Instalacja zablokowana", w którym po instalacji Android ostrzega użytkownika "Ta aplikacja zawiera kod, który próbuje ominąć zabezpieczenia systemu Android". Ponieważ nie jestem pewien, że jest to problem związany z techniką budowania, nie będę rozszerzał tego pytania w celu uwzględnienia tego problemu (ale jeśli ktoś ma wkład w ten problem, proszę doradzić).

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

18
2017-08-15 16:18


pochodzenie


Co robi twój OpenCV build.gradle wyglądać jak plik? Musimy wiedzieć, czy są to pliki statyczne czy udostępniane, które kompilujesz. - Igor Ganapolsky
Wygląda na to, że nie robi nic ciekawego: github.com/sengsational/HelloCv/blob/master/openCVLibrary310/... - Dale
Jest więcej od zespołu OpenCV na temat robienia natywnego kodu na Androida tutaj: docs.opencv.org/doc/tutorials/introduction/... - Dale
Rozumiem, więc używają Android.mk zamiast Gradle-eksperymentalnego NDK. Twoje podejście do Cmake jest dobre w tej sytuacji. - Igor Ganapolsky
To pytanie jest naprawdę dobre. Niektóre samouczki dotyczące AndroidNDK / OpenCV, które spotkałem, są uciążliwe (zob youtube.com/watch?v=Oq3oiCfSgbo), w której musisz skompilować nagłówki jni itp., a moc magii IntelliJ w Android Studio zostanie utracona. +1 dla pytania i +1 dla odpowiedzi poniżej. - ATutorMe


Odpowiedzi:


Wygląda na to, że już zaimportowałeś moduł opencv, otwórz teraz plik 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} )

dołączyć swoją bibliotekę lib_opencv, którą utworzyłeś. Aby zakończyć, dodaj następujący wiersz:

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

w aplikacji modułu, na przykład:

externalNativeBuild {

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

i poniżej dodanych typów buildTypes:

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

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


19
2017-08-18 01:56



Te sugerowane zmiany zostały włączone do przykładowego kodu na GitHub, a projekt teraz kompiluje, aczkolwiek z ostrzeżeniem o zabezpieczeniach. github.com/sengsational/HelloCv - Dale
Człowieku skalnym, uratujesz mnie. Dzięki wielkie!!! - hunghd
Dlaczego napisałeś $\{log-lib} zamiast ${log-lib}? - Mateen Ulhaq
Brakuje "/" w ścieżce "set_target_properties (lib_opencv PROPERTIES IMPORTED_LOCATION do twojego projektu / MyApplication / app / src / main / jniLibs / $ {ANDROID_ABI} /libopencv_java3.so)" powodującej erozę kompilacji. Nie mogę edytować postu! (nie zmieni więcej niż 6 znaków) Dzięki za odpowiedź, uratowałeś mnie! - Geraldo Neto
Jakieś wskazówki, jak używać takich rzeczy w Unity na Androida? - Pierre Baret


Konfiguracja OpenCV 3.2 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. Tylko bądź pewien OPENCV_HOME wskazuje na katalog, w którym znajduje się OpenCV Android SDK.

Jedną dodatkową zaletą tego podejścia - możesz statycznie połączyć się z OpenCV, co radykalnie zmniejszy rozmiar twojej aplikacji / biblioteki.

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


5
2017-07-12 07:04



@abggcv to nie jest. Jeśli budujesz OpenCV samodzielnie, nie potrzebujesz ani OpenCV Java SDK, ani OpenCV Manager. - Dmitry Zaytsev
masz rację Stwierdziłem, że projekt na Androida, nad którym pracowałem, korzystał z niektórych funkcji Androida OpenCV, takich jak most kamery (coś w tym rodzaju) i może dlatego właśnie był wymagany OpenCV Manager. W innym projekcie używam po prostu opencv do odczytu obrazu z pliku i nie pytam już o menedżera opencv. To działa dobrze. Jeszcze jedną rzeczą, którą chciałbym dodać, jest to, że nie działało to dla mnie, dopóki nie dodałem ścieżki do włączenia: include_directories(${OPENCV_HOME}/sdk/native/jni/include) do CMakeLists.txt. - abggcv
Dzięki @Dimitry Sprawdziłem twoje repozytorium, a także znalazłem kod aplikacji aparatu Fotoapparat. Czy to jest lepsze niż aplikacje cwac, kamery cwac2 dla Androida? Pracuję nad aplikacją aparatu i chcę sterować funkcjami aparatu takimi jak ostrość i ekspozycja itp. Za pomocą kodu. Czy jest to coś, z czym może ci pomóc repo? Również twój kod repo rozwiązuje problemy, takie jak obrócone zdjęcia, rozmiar ekranu itp. - abggcv
@abggcv stworzyliśmy Fotoapparat, ponieważ nie byliśmy już zadowoleni z kamery cacac. Jeśli chodzi o DJINNI_HOME - sprawdź to repo: github.com/dropbox/djinni - Dmitry Zaytsev
Jest to jedyne rozwiązanie, które mogłem znaleźć dla budowania i używania bibliotek OpenCV z C ++ na Androida, które działało. Twoja aplikacja FaceDetector była dla mnie bardzo przydatnym punktem odniesienia przy próbie rozwiązania moich problemów. Dziękuję Ci bardzo! - NickG