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++ :
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)
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
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
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)
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'
}
}
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