diff --git a/3rdparty/lib/armeabi-v7a/libnative_camera_r2.2.0.so b/3rdparty/lib/armeabi-v7a/libnative_camera_r2.2.0.so index ba36efcdf5..fb34509bd5 100755 Binary files a/3rdparty/lib/armeabi-v7a/libnative_camera_r2.2.0.so and b/3rdparty/lib/armeabi-v7a/libnative_camera_r2.2.0.so differ diff --git a/3rdparty/lib/armeabi-v7a/libnative_camera_r2.3.3.so b/3rdparty/lib/armeabi-v7a/libnative_camera_r2.3.3.so index 1868ed2c8c..fce58145c4 100644 Binary files a/3rdparty/lib/armeabi-v7a/libnative_camera_r2.3.3.so and b/3rdparty/lib/armeabi-v7a/libnative_camera_r2.3.3.so differ diff --git a/3rdparty/lib/armeabi-v7a/libnative_camera_r3.0.1.so b/3rdparty/lib/armeabi-v7a/libnative_camera_r3.0.1.so index 295cbc6b03..2498763d0f 100755 Binary files a/3rdparty/lib/armeabi-v7a/libnative_camera_r3.0.1.so and b/3rdparty/lib/armeabi-v7a/libnative_camera_r3.0.1.so differ diff --git a/3rdparty/lib/armeabi-v7a/libnative_camera_r4.0.0.so b/3rdparty/lib/armeabi-v7a/libnative_camera_r4.0.0.so index d34fa65d81..9a7047b55d 100755 Binary files a/3rdparty/lib/armeabi-v7a/libnative_camera_r4.0.0.so and b/3rdparty/lib/armeabi-v7a/libnative_camera_r4.0.0.so differ diff --git a/3rdparty/lib/armeabi-v7a/libnative_camera_r4.0.3.so b/3rdparty/lib/armeabi-v7a/libnative_camera_r4.0.3.so index b6b8f4df50..98e0d9ea08 100755 Binary files a/3rdparty/lib/armeabi-v7a/libnative_camera_r4.0.3.so and b/3rdparty/lib/armeabi-v7a/libnative_camera_r4.0.3.so differ diff --git a/3rdparty/lib/armeabi-v7a/libnative_camera_r4.1.1.so b/3rdparty/lib/armeabi-v7a/libnative_camera_r4.1.1.so index 1fec795114..fe147823ec 100644 Binary files a/3rdparty/lib/armeabi-v7a/libnative_camera_r4.1.1.so and b/3rdparty/lib/armeabi-v7a/libnative_camera_r4.1.1.so differ diff --git a/3rdparty/lib/armeabi/libnative_camera_r2.2.0.so b/3rdparty/lib/armeabi/libnative_camera_r2.2.0.so index f26d26a252..a0db0d1997 100755 Binary files a/3rdparty/lib/armeabi/libnative_camera_r2.2.0.so and b/3rdparty/lib/armeabi/libnative_camera_r2.2.0.so differ diff --git a/3rdparty/lib/armeabi/libnative_camera_r2.3.3.so b/3rdparty/lib/armeabi/libnative_camera_r2.3.3.so index 78c104c114..6f167cb0cb 100755 Binary files a/3rdparty/lib/armeabi/libnative_camera_r2.3.3.so and b/3rdparty/lib/armeabi/libnative_camera_r2.3.3.so differ diff --git a/3rdparty/lib/armeabi/libnative_camera_r3.0.1.so b/3rdparty/lib/armeabi/libnative_camera_r3.0.1.so index c5532e36b5..26d286a18d 100755 Binary files a/3rdparty/lib/armeabi/libnative_camera_r3.0.1.so and b/3rdparty/lib/armeabi/libnative_camera_r3.0.1.so differ diff --git a/3rdparty/lib/armeabi/libnative_camera_r4.0.0.so b/3rdparty/lib/armeabi/libnative_camera_r4.0.0.so index fae5d9bad0..f29707cae3 100755 Binary files a/3rdparty/lib/armeabi/libnative_camera_r4.0.0.so and b/3rdparty/lib/armeabi/libnative_camera_r4.0.0.so differ diff --git a/3rdparty/lib/armeabi/libnative_camera_r4.0.3.so b/3rdparty/lib/armeabi/libnative_camera_r4.0.3.so index 8543503106..85e0320a9c 100755 Binary files a/3rdparty/lib/armeabi/libnative_camera_r4.0.3.so and b/3rdparty/lib/armeabi/libnative_camera_r4.0.3.so differ diff --git a/3rdparty/lib/armeabi/libnative_camera_r4.1.1.so b/3rdparty/lib/armeabi/libnative_camera_r4.1.1.so index 352461f82c..35c5141b9c 100644 Binary files a/3rdparty/lib/armeabi/libnative_camera_r4.1.1.so and b/3rdparty/lib/armeabi/libnative_camera_r4.1.1.so differ diff --git a/3rdparty/lib/x86/libnative_camera_r2.3.3.so b/3rdparty/lib/x86/libnative_camera_r2.3.3.so index 4e04a3e23f..d40409f222 100755 Binary files a/3rdparty/lib/x86/libnative_camera_r2.3.3.so and b/3rdparty/lib/x86/libnative_camera_r2.3.3.so differ diff --git a/3rdparty/lib/x86/libnative_camera_r3.0.1.so b/3rdparty/lib/x86/libnative_camera_r3.0.1.so index 6d3a898061..221b833a5b 100755 Binary files a/3rdparty/lib/x86/libnative_camera_r3.0.1.so and b/3rdparty/lib/x86/libnative_camera_r3.0.1.so differ diff --git a/3rdparty/lib/x86/libnative_camera_r4.0.3.so b/3rdparty/lib/x86/libnative_camera_r4.0.3.so index c00c957015..786d6dccbf 100755 Binary files a/3rdparty/lib/x86/libnative_camera_r4.0.3.so and b/3rdparty/lib/x86/libnative_camera_r4.0.3.so differ diff --git a/3rdparty/lib/x86/libnative_camera_r4.1.1.so b/3rdparty/lib/x86/libnative_camera_r4.1.1.so index df22898b45..8ec6cb74d9 100644 Binary files a/3rdparty/lib/x86/libnative_camera_r4.1.1.so and b/3rdparty/lib/x86/libnative_camera_r4.1.1.so differ diff --git a/3rdparty/libjasper/jpc_qmfb.c b/3rdparty/libjasper/jpc_qmfb.c index 925f289fd7..a8460d3cdc 100644 --- a/3rdparty/libjasper/jpc_qmfb.c +++ b/3rdparty/libjasper/jpc_qmfb.c @@ -94,14 +94,14 @@ #define QMFB_SPLITBUFSIZE 4096 #define QMFB_JOINBUFSIZE 4096 -int jpc_ft_analyze(jpc_fix_t *a, int xstart, int ystart, int width, int height, +int jpc_ft_analyze(int *a, int xstart, int ystart, int width, int height, int stride); int jpc_ft_synthesize(int *a, int xstart, int ystart, int width, int height, int stride); -int jpc_ns_analyze(jpc_fix_t *a, int xstart, int ystart, int width, int height, +int jpc_ns_analyze(int *a, int xstart, int ystart, int width, int height, int stride); -int jpc_ns_synthesize(jpc_fix_t *a, int xstart, int ystart, int width, +int jpc_ns_synthesize(int *a, int xstart, int ystart, int width, int height, int stride); void jpc_ft_fwdlift_row(jpc_fix_t *a, int numcols, int parity); @@ -1556,7 +1556,7 @@ void jpc_ft_invlift_colres(jpc_fix_t *a, int numrows, int numcols, int stride, } -int jpc_ft_analyze(jpc_fix_t *a, int xstart, int ystart, int width, int height, +int jpc_ft_analyze(int *a, int xstart, int ystart, int width, int height, int stride) { int numrows = height; @@ -1568,7 +1568,7 @@ int jpc_ft_analyze(jpc_fix_t *a, int xstart, int ystart, int width, int height, int maxcols; maxcols = (numcols / JPC_QMFB_COLGRPSIZE) * JPC_QMFB_COLGRPSIZE; - startptr = &a[0]; + startptr = (jpc_fix_t*)&a[0]; for (i = 0; i < maxcols; i += JPC_QMFB_COLGRPSIZE) { jpc_qmfb_split_colgrp(startptr, numrows, stride, rowparity); jpc_ft_fwdlift_colgrp(startptr, numrows, stride, rowparity); @@ -1581,7 +1581,7 @@ int jpc_ft_analyze(jpc_fix_t *a, int xstart, int ystart, int width, int height, rowparity); } - startptr = &a[0]; + startptr = (jpc_fix_t*)&a[0]; for (i = 0; i < numrows; ++i) { jpc_qmfb_split_row(startptr, numcols, colparity); jpc_ft_fwdlift_row(startptr, numcols, colparity); @@ -1604,7 +1604,7 @@ int jpc_ft_synthesize(int *a, int xstart, int ystart, int width, int height, jpc_fix_t *startptr; int i; - startptr = &a[0]; + startptr = (jpc_fix_t*)&a[0]; for (i = 0; i < numrows; ++i) { jpc_ft_invlift_row(startptr, numcols, colparity); jpc_qmfb_join_row(startptr, numcols, colparity); @@ -1612,7 +1612,7 @@ int jpc_ft_synthesize(int *a, int xstart, int ystart, int width, int height, } maxcols = (numcols / JPC_QMFB_COLGRPSIZE) * JPC_QMFB_COLGRPSIZE; - startptr = &a[0]; + startptr = (jpc_fix_t*)&a[0]; for (i = 0; i < maxcols; i += JPC_QMFB_COLGRPSIZE) { jpc_ft_invlift_colgrp(startptr, numrows, stride, rowparity); jpc_qmfb_join_colgrp(startptr, numrows, stride, rowparity); @@ -3068,7 +3068,7 @@ void jpc_ns_invlift_col(jpc_fix_t *a, int numrows, int stride, } -int jpc_ns_analyze(jpc_fix_t *a, int xstart, int ystart, int width, int height, +int jpc_ns_analyze(int *a, int xstart, int ystart, int width, int height, int stride) { @@ -3081,7 +3081,7 @@ int jpc_ns_analyze(jpc_fix_t *a, int xstart, int ystart, int width, int height, int maxcols; maxcols = (numcols / JPC_QMFB_COLGRPSIZE) * JPC_QMFB_COLGRPSIZE; - startptr = &a[0]; + startptr = (jpc_fix_t*)&a[0]; for (i = 0; i < maxcols; i += JPC_QMFB_COLGRPSIZE) { jpc_qmfb_split_colgrp(startptr, numrows, stride, rowparity); jpc_ns_fwdlift_colgrp(startptr, numrows, stride, rowparity); @@ -3094,7 +3094,7 @@ int jpc_ns_analyze(jpc_fix_t *a, int xstart, int ystart, int width, int height, rowparity); } - startptr = &a[0]; + startptr = (jpc_fix_t*)&a[0]; for (i = 0; i < numrows; ++i) { jpc_qmfb_split_row(startptr, numcols, colparity); jpc_ns_fwdlift_row(startptr, numcols, colparity); @@ -3105,7 +3105,7 @@ int jpc_ns_analyze(jpc_fix_t *a, int xstart, int ystart, int width, int height, } -int jpc_ns_synthesize(jpc_fix_t *a, int xstart, int ystart, int width, +int jpc_ns_synthesize(int *a, int xstart, int ystart, int width, int height, int stride) { @@ -3117,7 +3117,7 @@ int jpc_ns_synthesize(jpc_fix_t *a, int xstart, int ystart, int width, jpc_fix_t *startptr; int i; - startptr = &a[0]; + startptr = (jpc_fix_t*)&a[0]; for (i = 0; i < numrows; ++i) { jpc_ns_invlift_row(startptr, numcols, colparity); jpc_qmfb_join_row(startptr, numcols, colparity); @@ -3125,7 +3125,7 @@ int jpc_ns_synthesize(jpc_fix_t *a, int xstart, int ystart, int width, } maxcols = (numcols / JPC_QMFB_COLGRPSIZE) * JPC_QMFB_COLGRPSIZE; - startptr = &a[0]; + startptr = (jpc_fix_t*)&a[0]; for (i = 0; i < maxcols; i += JPC_QMFB_COLGRPSIZE) { jpc_ns_invlift_colgrp(startptr, numrows, stride, rowparity); jpc_qmfb_join_colgrp(startptr, numrows, stride, rowparity); diff --git a/3rdparty/openexr/CMakeLists.txt b/3rdparty/openexr/CMakeLists.txt index ea8c79ed72..a77a6e1326 100644 --- a/3rdparty/openexr/CMakeLists.txt +++ b/3rdparty/openexr/CMakeLists.txt @@ -37,7 +37,7 @@ endif() source_group("Include" FILES ${lib_hdrs} ) source_group("Src" FILES ${lib_srcs}) -ocv_warnings_disable(CMAKE_CXX_FLAGS -Wshadow -Wunused -Wsign-compare -Wundef -Wmissing-declarations -Wuninitialized -Wswitch -Wparentheses) +ocv_warnings_disable(CMAKE_CXX_FLAGS -Wshadow -Wunused -Wsign-compare -Wundef -Wmissing-declarations -Wuninitialized -Wswitch -Wparentheses -Warray-bounds -Wextra) ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4018 /wd4099 /wd4100 /wd4101 /wd4127 /wd4189 /wd4245 /wd4305 /wd4389 /wd4512 /wd4701 /wd4702 /wd4706 /wd4800) # vs2005 ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4334) # vs2005 Win64 ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4244) # vs2008 diff --git a/3rdparty/tbb/CMakeLists.txt b/3rdparty/tbb/CMakeLists.txt index c89b9a3ef6..bf91f4d8b8 100644 --- a/3rdparty/tbb/CMakeLists.txt +++ b/3rdparty/tbb/CMakeLists.txt @@ -5,12 +5,18 @@ endif() project(tbb) -# 4.0 update 5 - works fine -set(tbb_ver "tbb40_20120613oss") -set(tbb_url "http://threadingbuildingblocks.org/uploads/77/187/4.0%20update%205/tbb40_20120613oss_src.tgz") -set(tbb_md5 "da01ed74944ec5950cfae3476901a172") +# 4.1 - works fine +set(tbb_ver "tbb41_20120718oss") +set(tbb_url "http://threadingbuildingblocks.org/uploads/77/188/4.1/tbb41_20120718oss_src.tgz") +set(tbb_md5 "31b9ec300f3d09da2504d5d882788dd4") set(tbb_version_file "version_string.ver") +# 4.0 update 5 - works fine +#set(tbb_ver "tbb40_20120613oss") +#set(tbb_url "http://threadingbuildingblocks.org/uploads/77/187/4.0%20update%205/tbb40_20120613oss_src.tgz") +#set(tbb_md5 "da01ed74944ec5950cfae3476901a172") +#set(tbb_version_file "version_string.ver") + # 4.0 update 4 - works fine #set(tbb_ver "tbb40_20120408oss") #set(tbb_url "http://threadingbuildingblocks.org/uploads/77/185/4.0%20update%204/tbb40_20120408oss_src.tgz") diff --git a/CMakeLists.txt b/CMakeLists.txt index e6639a962e..f1c6c57c74 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -60,7 +60,7 @@ endif() project(OpenCV CXX C) -include(cmake/OpenCVUtils.cmake REQUIRED) +include(cmake/OpenCVUtils.cmake) # ---------------------------------------------------------------------------- # Break in case of popular CMake configuration mistakes @@ -73,7 +73,7 @@ endif() # ---------------------------------------------------------------------------- # Detect compiler and target platform architecture # ---------------------------------------------------------------------------- -include(cmake/OpenCVDetectCXXCompiler.cmake REQUIRED) +include(cmake/OpenCVDetectCXXCompiler.cmake) # Add these standard paths to the search paths for FIND_LIBRARY # to find libraries from these locations first @@ -159,7 +159,6 @@ OCV_OPTION(BUILD_FAT_JAVA_LIB "Create fat java wrapper containing the whol OCV_OPTION(BUILD_ANDROID_SERVICE "Build OpenCV Manager for Google Play" OFF IF ANDROID AND ANDROID_USE_STLPORT AND ANDROID_SOURCE_TREE ) OCV_OPTION(BUILD_ANDROID_PACKAGE "Build platform-specific package for Google Play" OFF IF ANDROID ) - # 3rd party libs OCV_OPTION(BUILD_ZLIB "Build zlib from source" WIN32 OR APPLE ) OCV_OPTION(BUILD_TIFF "Build libtiff from source" WIN32 OR ANDROID OR APPLE ) @@ -168,24 +167,19 @@ OCV_OPTION(BUILD_JPEG "Build libjpeg from source" WIN32 OR AN OCV_OPTION(BUILD_PNG "Build libpng from source" WIN32 OR ANDROID OR APPLE ) OCV_OPTION(BUILD_OPENEXR "Build openexr from source" WIN32 OR ANDROID OR APPLE ) + # OpenCV installation options # =================================================== OCV_OPTION(INSTALL_C_EXAMPLES "Install C examples" OFF ) OCV_OPTION(INSTALL_PYTHON_EXAMPLES "Install Python examples" OFF ) -OCV_OPTION(INSTALL_ANDROID_EXAMPLES "Install Android examples" OFF IF ANDROID ) +OCV_OPTION(INSTALL_ANDROID_EXAMPLES "Install Android examples" OFF IF ANDROID ) OCV_OPTION(INSTALL_TO_MANGLED_PATHS "Enables mangled install paths, that help with side by side installs." OFF IF (UNIX AND NOT ANDROID AND NOT IOS AND BUILD_SHARED_LIBS) ) -if(MSVC_IDE OR CMAKE_GENERATOR MATCHES Xcode) - set(ENABLE_SOLUTION_FOLDERS0 ON) -else() - set(ENABLE_SOLUTION_FOLDERS0 OFF) -endif() - # OpenCV build options # =================================================== OCV_OPTION(ENABLE_PRECOMPILED_HEADERS "Use precompiled headers" ON IF (NOT IOS) ) -OCV_OPTION(ENABLE_SOLUTION_FOLDERS "Solution folder in Visual Studio or in other IDEs" ${ENABLE_SOLUTION_FOLDERS0} IF (CMAKE_VERSION VERSION_GREATER "2.8.0") ) +OCV_OPTION(ENABLE_SOLUTION_FOLDERS "Solution folder in Visual Studio or in other IDEs" (MSVC_IDE OR CMAKE_GENERATOR MATCHES Xcode) IF (CMAKE_VERSION VERSION_GREATER "2.8.0") ) OCV_OPTION(ENABLE_PROFILING "Enable profiling in the GCC compiler (Add flags: -g -pg)" OFF IF CMAKE_COMPILER_IS_GNUCXX ) OCV_OPTION(ENABLE_OMIT_FRAME_POINTER "Enable -fomit-frame-pointer for GCC" ON IF CMAKE_COMPILER_IS_GNUCXX ) OCV_OPTION(ENABLE_POWERPC "Enable PowerPC for GCC" ON IF (CMAKE_COMPILER_IS_GNUCXX AND CMAKE_SYSTEM_PROCESSOR MATCHES powerpc.*) ) @@ -196,6 +190,7 @@ OCV_OPTION(ENABLE_SSE3 "Enable SSE3 instructions" OCV_OPTION(ENABLE_SSSE3 "Enable SSSE3 instructions" OFF IF (CMAKE_COMPILER_IS_GNUCXX AND (X86 OR X86_64)) ) OCV_OPTION(ENABLE_SSE41 "Enable SSE4.1 instructions" OFF IF ((CV_ICC OR CMAKE_COMPILER_IS_GNUCXX) AND (X86 OR X86_64)) ) OCV_OPTION(ENABLE_SSE42 "Enable SSE4.2 instructions" OFF IF (CMAKE_COMPILER_IS_GNUCXX AND (X86 OR X86_64)) ) +OCV_OPTION(ENABLE_AVX "Enable AVX instructions" OFF IF ((MSVC OR CMAKE_COMPILER_IS_GNUCXX) AND (X86 OR X86_64)) ) OCV_OPTION(ENABLE_NOISY_WARNINGS "Show all warnings even if they are too noisy" OFF ) OCV_OPTION(OPENCV_WARNINGS_ARE_ERRORS "Treat warnings as errors" OFF ) @@ -212,7 +207,7 @@ include(cmake/OpenCVLegacyOptions.cmake OPTIONAL) # ---------------------------------------------------------------------------- # Get actual OpenCV version number from sources # ---------------------------------------------------------------------------- -include(cmake/OpenCVVersion.cmake REQUIRED) +include(cmake/OpenCVVersion.cmake) # ---------------------------------------------------------------------------- @@ -223,33 +218,33 @@ include(cmake/OpenCVVersion.cmake REQUIRED) set(EXECUTABLE_OUTPUT_PATH "${CMAKE_BINARY_DIR}/bin" CACHE PATH "Output directory for applications" ) if(ANDROID OR WIN32) - set(OPENCV_DOC_INSTALL_PATH doc) + set(OPENCV_DOC_INSTALL_PATH doc) elseif(INSTALL_TO_MANGLED_PATHS) - set(OPENCV_DOC_INSTALL_PATH share/OpenCV-${OPENCV_VERSION}/doc) + set(OPENCV_DOC_INSTALL_PATH share/OpenCV-${OPENCV_VERSION}/doc) else() - set(OPENCV_DOC_INSTALL_PATH share/OpenCV/doc) + set(OPENCV_DOC_INSTALL_PATH share/OpenCV/doc) endif() if(ANDROID) - set(LIBRARY_OUTPUT_PATH "${OpenCV_BINARY_DIR}/lib/${ANDROID_NDK_ABI_NAME}") - set(3P_LIBRARY_OUTPUT_PATH "${OpenCV_BINARY_DIR}/3rdparty/lib/${ANDROID_NDK_ABI_NAME}") - set(OPENCV_LIB_INSTALL_PATH sdk/native/libs/${ANDROID_NDK_ABI_NAME}) - set(OPENCV_3P_LIB_INSTALL_PATH sdk/native/3rdparty/libs/${ANDROID_NDK_ABI_NAME}) - set(OPENCV_CONFIG_INSTALL_PATH sdk/native/jni) - set(OPENCV_INCLUDE_INSTALL_PATH sdk/native/jni/include) + set(LIBRARY_OUTPUT_PATH "${OpenCV_BINARY_DIR}/lib/${ANDROID_NDK_ABI_NAME}") + set(3P_LIBRARY_OUTPUT_PATH "${OpenCV_BINARY_DIR}/3rdparty/lib/${ANDROID_NDK_ABI_NAME}") + set(OPENCV_LIB_INSTALL_PATH sdk/native/libs/${ANDROID_NDK_ABI_NAME}) + set(OPENCV_3P_LIB_INSTALL_PATH sdk/native/3rdparty/libs/${ANDROID_NDK_ABI_NAME}) + set(OPENCV_CONFIG_INSTALL_PATH sdk/native/jni) + set(OPENCV_INCLUDE_INSTALL_PATH sdk/native/jni/include) else() - set(LIBRARY_OUTPUT_PATH "${OpenCV_BINARY_DIR}/lib") - set(3P_LIBRARY_OUTPUT_PATH "${OpenCV_BINARY_DIR}/3rdparty/lib${LIB_SUFFIX}") - set(OPENCV_LIB_INSTALL_PATH lib${LIB_SUFFIX}) - set(OPENCV_3P_LIB_INSTALL_PATH share/OpenCV/3rdparty/${OPENCV_LIB_INSTALL_PATH}) - set(OPENCV_INCLUDE_INSTALL_PATH include) + set(LIBRARY_OUTPUT_PATH "${OpenCV_BINARY_DIR}/lib") + set(3P_LIBRARY_OUTPUT_PATH "${OpenCV_BINARY_DIR}/3rdparty/lib${LIB_SUFFIX}") + set(OPENCV_LIB_INSTALL_PATH lib${LIB_SUFFIX}) + set(OPENCV_3P_LIB_INSTALL_PATH share/OpenCV/3rdparty/${OPENCV_LIB_INSTALL_PATH}) + set(OPENCV_INCLUDE_INSTALL_PATH include) - math(EXPR SIZEOF_VOID_P_BITS "8 * ${CMAKE_SIZEOF_VOID_P}") - if(LIB_SUFFIX AND NOT SIZEOF_VOID_P_BITS EQUAL LIB_SUFFIX) - set(OPENCV_CONFIG_INSTALL_PATH lib${LIB_SUFFIX}/cmake/opencv) - else() - set(OPENCV_CONFIG_INSTALL_PATH share/OpenCV) - endif() + math(EXPR SIZEOF_VOID_P_BITS "8 * ${CMAKE_SIZEOF_VOID_P}") + if(LIB_SUFFIX AND NOT SIZEOF_VOID_P_BITS EQUAL LIB_SUFFIX) + set(OPENCV_CONFIG_INSTALL_PATH lib${LIB_SUFFIX}/cmake/opencv) + else() + set(OPENCV_CONFIG_INSTALL_PATH share/OpenCV) + endif() endif() set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${OPENCV_LIB_INSTALL_PATH}") @@ -293,7 +288,7 @@ ocv_include_directories(${OPENCV_CONFIG_FILE_INCLUDE_DIR}) # don't use FindGit because it requires CMake 2.8.2 set(git_names git eg) # eg = easy git # Prefer .cmd variants on Windows unless running in a Makefile in the MSYS shell -if(WIN32) +if(CMAKE_HOST_WIN32) if(NOT CMAKE_GENERATOR MATCHES "MSYS") set(git_names git.cmd git eg.cmd eg) endif() @@ -329,7 +324,7 @@ if(CMAKE_GENERATOR MATCHES "Makefiles|Ninja" AND "${CMAKE_BUILD_TYPE}" STREQUAL set(CMAKE_BUILD_TYPE Release) endif() -include(cmake/OpenCVCompilerOptions.cmake REQUIRED) +include(cmake/OpenCVCompilerOptions.cmake) # ---------------------------------------------------------------------------- @@ -337,7 +332,7 @@ include(cmake/OpenCVCompilerOptions.cmake REQUIRED) # Default: dynamic # ---------------------------------------------------------------------------- if(MSVC) - include(cmake/OpenCVCRTLinkage.cmake REQUIRED) + include(cmake/OpenCVCRTLinkage.cmake) endif(MSVC) if(WIN32 AND NOT MINGW) @@ -370,17 +365,17 @@ if(UNIX) endif() endif() -include(cmake/OpenCVPCHSupport.cmake REQUIRED) -include(cmake/OpenCVModule.cmake REQUIRED) +include(cmake/OpenCVPCHSupport.cmake) +include(cmake/OpenCVModule.cmake) # ---------------------------------------------------------------------------- # Detect 3rd-party libraries # ---------------------------------------------------------------------------- -include(cmake/OpenCVFindLibsGrfmt.cmake REQUIRED) -include(cmake/OpenCVFindLibsGUI.cmake REQUIRED) -include(cmake/OpenCVFindLibsVideo.cmake REQUIRED) -include(cmake/OpenCVFindLibsPerf.cmake REQUIRED) +include(cmake/OpenCVFindLibsGrfmt.cmake) +include(cmake/OpenCVFindLibsGUI.cmake) +include(cmake/OpenCVFindLibsVideo.cmake) +include(cmake/OpenCVFindLibsPerf.cmake) # ---------------------------------------------------------------------------- @@ -389,21 +384,23 @@ include(cmake/OpenCVFindLibsPerf.cmake REQUIRED) # --- LATEX for pdf documentation --- if(BUILD_DOCS) - include(cmake/OpenCVFindLATEX.cmake REQUIRED) + include(cmake/OpenCVFindLATEX.cmake) endif(BUILD_DOCS) # --- Python Support --- -include(cmake/OpenCVDetectPython.cmake REQUIRED) +include(cmake/OpenCVDetectPython.cmake) # --- Java Support --- +include(cmake/OpenCVDetectApacheAnt.cmake) if(ANDROID) - include(cmake/OpenCVDetectApacheAnt.cmake REQUIRED) - include(cmake/OpenCVDetectAndroidSDK.cmake REQUIRED) + include(cmake/OpenCVDetectAndroidSDK.cmake) if(NOT ANDROID_TOOLS_Pkg_Revision GREATER 13) message(WARNING "OpenCV requires Android SDK tools revision 14 or newer. Otherwise tests and samples will no be compiled.") endif() -endif(ANDROID) +elseif(ANT_EXECUTABLE) + find_package(JNI) +endif() if(ANDROID AND ANDROID_EXECUTABLE AND ANT_EXECUTABLE AND (ANT_VERSION VERSION_GREATER 1.7) AND (ANDROID_TOOLS_Pkg_Revision GREATER 13)) SET(CAN_BUILD_ANDROID_PROJECTS TRUE) @@ -413,7 +410,7 @@ endif() # --- OpenCL --- if(WITH_OPENCL) - include(cmake/OpenCVDetectOpenCL.cmake REQUIRED) + include(cmake/OpenCVDetectOpenCL.cmake) if(OPENCL_FOUND) set(HAVE_OPENCL 1) endif() @@ -434,7 +431,7 @@ if(ENABLE_SOLUTION_FOLDERS) endif() # Extra OpenCV targets: uninstall, package_source, perf, etc. -include(cmake/OpenCVExtraTargets.cmake REQUIRED) +include(cmake/OpenCVExtraTargets.cmake) # ---------------------------------------------------------------------------- @@ -475,16 +472,16 @@ endif() ocv_track_build_dependencies() # Generate platform-dependent and configuration-dependent headers -include(cmake/OpenCVGenHeaders.cmake REQUIRED) +include(cmake/OpenCVGenHeaders.cmake) # Generate opencv.pc for pkg-config command -include(cmake/OpenCVGenPkgconfig.cmake REQUIRED) +include(cmake/OpenCVGenPkgconfig.cmake) # Generate OpenCV.mk for ndk-build (Android build tool) -include(cmake/OpenCVGenAndroidMK.cmake REQUIRED) +include(cmake/OpenCVGenAndroidMK.cmake) # Generate OpenCVДonfig.cmake and OpenCVConfig-version.cmake for cmake projects -include(cmake/OpenCVGenConfig.cmake REQUIRED) +include(cmake/OpenCVGenConfig.cmake) # ---------------------------------------------------------------------------- @@ -760,7 +757,7 @@ status(" Use Clp:" HAVE_CLP THEN YES ELSE NO) if(HAVE_CUDA) status("") - status(" NVIDIA CUDA:" "(ver ${CUDA_VERSION_STRING})") + status(" NVIDIA CUDA") status(" Use CUFFT:" HAVE_CUFFT THEN YES ELSE NO) status(" Use CUBLAS:" HAVE_CUBLAS THEN YES ELSE NO) @@ -774,9 +771,9 @@ status(" Python:") status(" Interpreter:" PYTHON_EXECUTABLE THEN "${PYTHON_EXECUTABLE} (ver ${PYTHON_VERSION_FULL})" ELSE NO) if(BUILD_opencv_python) if(PYTHONLIBS_VERSION_STRING) - status(" Libraries:" HAVE_opencv_python THEN "${PYTHON_LIBRARIES} (ver ${PYTHONLIBS_VERSION_STRING})" ELSE NO) + status(" Libraries:" HAVE_opencv_python THEN "${PYTHON_LIBRARIES} (ver ${PYTHONLIBS_VERSION_STRING})" ELSE NO) else() - status(" Libraries:" HAVE_opencv_python THEN ${PYTHON_LIBRARIES} ELSE NO) + status(" Libraries:" HAVE_opencv_python THEN ${PYTHON_LIBRARIES} ELSE NO) endif() status(" numpy:" PYTHON_USE_NUMPY THEN "${PYTHON_NUMPY_INCLUDE_DIR} (ver ${PYTHON_NUMPY_VERSION})" ELSE "NO (Python wrappers can not be generated)") status(" packages path:" PYTHON_EXECUTABLE THEN "${PYTHON_PACKAGES_PATH}" ELSE "-") diff --git a/android/android.toolchain.cmake b/android/android.toolchain.cmake index b8dd429e2c..4bb4320471 100644 --- a/android/android.toolchain.cmake +++ b/android/android.toolchain.cmake @@ -250,6 +250,9 @@ set( CMAKE_SYSTEM_NAME Linux ) # this one not so much set( CMAKE_SYSTEM_VERSION 1 ) +# rpath makes low sence for Android +set( CMAKE_SKIP_RPATH TRUE CACHE BOOL "If set, runtime paths are not added when using shared libraries." ) + set( ANDROID_SUPPORTED_NDK_VERSIONS ${ANDROID_EXTRA_NDK_VERSIONS} -r8b -r8 -r7c -r7b -r7 -r6b -r6 -r5c -r5b -r5 "" ) if(NOT DEFINED ANDROID_NDK_SEARCH_PATHS) if( CMAKE_HOST_WIN32 ) @@ -471,7 +474,7 @@ elseif( ANDROID_STANDALONE_TOOLCHAIN ) set( BUILD_WITH_STANDALONE_TOOLCHAIN True ) else() list(GET ANDROID_NDK_SEARCH_PATHS 0 ANDROID_NDK_SEARCH_PATH) - message( FATAL_ERROR "Could not find neither Android NDK nor Android standalone toolcahin. + message( FATAL_ERROR "Could not find neither Android NDK nor Android standalone toolchain. You should either set an environment variable: export ANDROID_NDK=~/my-android-ndk or @@ -770,6 +773,27 @@ You are strongly recommended to switch to another NDK release. " ) endif() +if( NOT _CMAKE_IN_TRY_COMPILE AND X86 AND ANDROID_STL MATCHES "gnustl" AND ANDROID_NDK_RELEASE STREQUAL "r6" ) + message( WARNING "The x86 system header file from NDK r6 has incorrect definition for ptrdiff_t. You are recommended to upgrade to a newer NDK release or manually patch the header: +See https://android.googlesource.com/platform/development.git f907f4f9d4e56ccc8093df6fee54454b8bcab6c2 + diff --git a/ndk/platforms/android-9/arch-x86/include/machine/_types.h b/ndk/platforms/android-9/arch-x86/include/machine/_types.h + index 5e28c64..65892a1 100644 + --- a/ndk/platforms/android-9/arch-x86/include/machine/_types.h + +++ b/ndk/platforms/android-9/arch-x86/include/machine/_types.h + @@ -51,7 +51,11 @@ typedef long int ssize_t; + #endif + #ifndef _PTRDIFF_T + #define _PTRDIFF_T + -typedef long ptrdiff_t; + +# ifdef __ANDROID__ + + typedef int ptrdiff_t; + +# else + + typedef long ptrdiff_t; + +# endif + #endif +" ) +endif() + # setup paths and STL for NDK if( BUILD_WITH_ANDROID_NDK ) set( ANDROID_TOOLCHAIN_ROOT "${ANDROID_NDK}/toolchains/${ANDROID_TOOLCHAIN_NAME}/prebuilt/${ANDROID_NDK_HOST_SYSTEM_NAME}" ) @@ -949,20 +973,6 @@ if( APPLE ) mark_as_advanced( CMAKE_INSTALL_NAME_TOOL ) endif() -# flags and definitions -remove_definitions( -DANDROID ) -add_definitions( -DANDROID ) - -if(ANDROID_SYSROOT MATCHES "[ ;\"]") - set( ANDROID_CXX_FLAGS "--sysroot=\"${ANDROID_SYSROOT}\"" ) - if( NOT _CMAKE_IN_TRY_COMPILE ) - # quotes will break try_compile and compiler identification - message(WARNING "Your Android system root has non-alphanumeric symbols. It can break compiler features detection and the whole build.") - endif() -else() - set( ANDROID_CXX_FLAGS "--sysroot=${ANDROID_SYSROOT}" ) -endif() - # Force set compilers because standard identification works badly for us include( CMakeForceCompiler ) CMAKE_FORCE_C_COMPILER( "${CMAKE_C_COMPILER}" GNU ) @@ -983,60 +993,54 @@ set( CMAKE_ASM_COMPILER_FORCED TRUE ) set( CMAKE_COMPILER_IS_GNUASM 1) set( CMAKE_ASM_SOURCE_FILE_EXTENSIONS s S asm ) -# NDK flags -if( ARMEABI OR ARMEABI_V7A ) - # NDK also defines -ffunction-sections -funwind-tables but they result in worse OpenCV performance - set( _CMAKE_CXX_FLAGS "-fPIC -Wno-psabi" ) - set( _CMAKE_C_FLAGS "-fPIC -Wno-psabi" ) - remove_definitions( -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ ) - add_definitions( -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ ) - # extra arm-specific flags - set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fsigned-char" ) -elseif( X86 ) - set( _CMAKE_CXX_FLAGS "-funwind-tables" ) - set( _CMAKE_C_FLAGS "-funwind-tables" ) -elseif( MIPS ) - set( _CMAKE_CXX_FLAGS "-fpic -Wno-psabi -fno-strict-aliasing -finline-functions -ffunction-sections -funwind-tables -fmessage-length=0 -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop -frename-registers" ) - set( _CMAKE_C_FLAGS "-fpic -Wno-psabi -fno-strict-aliasing -finline-functions -ffunction-sections -funwind-tables -fmessage-length=0 -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop -frename-registers" ) - set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fsigned-char" ) +# flags and definitions +remove_definitions( -DANDROID ) +add_definitions( -DANDROID ) + +if(ANDROID_SYSROOT MATCHES "[ ;\"]") + set( ANDROID_CXX_FLAGS "--sysroot=\"${ANDROID_SYSROOT}\"" ) + if( NOT _CMAKE_IN_TRY_COMPILE ) + # quotes will break try_compile and compiler identification + message(WARNING "Your Android system root has non-alphanumeric symbols. It can break compiler features detection and the whole build.") + endif() else() - set( _CMAKE_CXX_FLAGS "" ) - set( _CMAKE_C_FLAGS "" ) + set( ANDROID_CXX_FLAGS "--sysroot=${ANDROID_SYSROOT}" ) endif() -# release and debug flags +# NDK flags if( ARMEABI OR ARMEABI_V7A ) + set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fpic -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__" ) if( NOT ANDROID_FORCE_ARM_BUILD AND NOT ARMEABI_V6 ) # It is recommended to use the -mthumb compiler flag to force the generation # of 16-bit Thumb-1 instructions (the default being 32-bit ARM ones). - # O3 instead of O2/Os in release mode - like cmake sets for desktop gcc - set( _CMAKE_CXX_FLAGS_RELEASE "-mthumb -O3" ) - set( _CMAKE_C_FLAGS_RELEASE "-mthumb -O3" ) - set( _CMAKE_CXX_FLAGS_DEBUG "-marm -Os -finline-limit=64" ) - set( _CMAKE_C_FLAGS_DEBUG "-marm -Os -finline-limit=64" ) + set( ANDROID_CXX_FLAGS_RELEASE "-mthumb" ) + set( ANDROID_CXX_FLAGS_DEBUG "-marm -finline-limit=64" ) else() # always compile ARMEABI_V6 in arm mode; otherwise there is no difference from ARMEABI # O3 instead of O2/Os in release mode - like cmake sets for desktop gcc - set( _CMAKE_CXX_FLAGS_RELEASE "-marm -O3 -fstrict-aliasing" ) - set( _CMAKE_C_FLAGS_RELEASE "-marm -O3 -fstrict-aliasing" ) - set( _CMAKE_CXX_FLAGS_DEBUG "-marm -O0 -finline-limit=300" ) - set( _CMAKE_C_FLAGS_DEBUG "-marm -O0 -finline-limit=300" ) + set( ANDROID_CXX_FLAGS_RELEASE "-marm" ) + set( ANDROID_CXX_FLAGS_DEBUG "-marm -finline-limit=300" ) endif() elseif( X86 ) - set( _CMAKE_CXX_FLAGS_RELEASE "-O3 -fstrict-aliasing" ) - set( _CMAKE_C_FLAGS_RELEASE "-O3 -fstrict-aliasing" ) - set( _CMAKE_CXX_FLAGS_DEBUG "-O0 -finline-limit=300" ) - set( _CMAKE_C_FLAGS_DEBUG "-O0 -finline-limit=300" ) + set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -funwind-tables" ) + set( ANDROID_CXX_FLAGS_RELEASE "" ) + set( ANDROID_CXX_FLAGS_DEBUG "-finline-limit=300" ) elseif( MIPS ) - set( _CMAKE_CXX_FLAGS_RELEASE "-O3 -funswitch-loops -finline-limit=300" ) - set( _CMAKE_C_FLAGS_RELEASE "-O3 -funswitch-loops -finline-limit=300" ) - set( _CMAKE_CXX_FLAGS_DEBUG "-O0 -g" ) - set( _CMAKE_C_FLAGS_DEBUG "-O0 -g" ) + set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fpic -funwind-tables -fmessage-length=0 -fno-inline-functions-called-once -frename-registers" ) + set( ANDROID_CXX_FLAGS_RELEASE "-finline-limit=300 -fno-strict-aliasing" ) + set( ANDROID_CXX_FLAGS_DEBUG "-finline-functions -fgcse-after-reload -frerun-cse-after-loop" ) +elseif() + set( ANDROID_CXX_FLAGS_RELEASE "" ) + set( ANDROID_CXX_FLAGS_DEBUG "" ) endif() -set( _CMAKE_CXX_FLAGS_RELEASE "${_CMAKE_CXX_FLAGS_RELEASE} -fomit-frame-pointer -DNDEBUG" ) -set( _CMAKE_C_FLAGS_RELEASE "${_CMAKE_C_FLAGS_RELEASE} -fomit-frame-pointer -DNDEBUG" ) -set( _CMAKE_CXX_FLAGS_DEBUG "${_CMAKE_CXX_FLAGS_DEBUG} -fno-strict-aliasing -fno-omit-frame-pointer -DDEBUG -D_DEBUG" ) -set( _CMAKE_C_FLAGS_DEBUG "${_CMAKE_C_FLAGS_DEBUG} -fno-strict-aliasing -fno-omit-frame-pointer -DDEBUG -D_DEBUG" ) + +if( NOT X86 ) + set( ANDROID_CXX_FLAGS "-Wno-psabi ${ANDROID_CXX_FLAGS}" ) +endif() + +set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fsigned-char" ) # good/necessary when porting desktop libraries +set( ANDROID_CXX_FLAGS_RELEASE "${ANDROID_CXX_FLAGS_RELEASE} -fomit-frame-pointer" ) +set( ANDROID_CXX_FLAGS_DEBUG "${ANDROID_CXX_FLAGS_DEBUG} -fno-strict-aliasing -fno-omit-frame-pointer" ) # ABI-specific flags if( ARMEABI_V7A ) @@ -1052,135 +1056,157 @@ elseif( ARMEABI_V6 ) set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -march=armv6 -mfloat-abi=softfp -mfpu=vfp" ) elseif( ARMEABI ) set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -march=armv5te -mtune=xscale -msoft-float" ) -elseif( X86 ) - set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS}" )#sse? endif() # STL -if( 0 AND EXISTS "${__libstl}" OR EXISTS "${__libsupcxx}" ) - # use gcc as a C++ linker to avoid automatic picking of libsdtc++ - set( CMAKE_CXX_CREATE_SHARED_LIBRARY " -o ") - set( CMAKE_CXX_CREATE_SHARED_MODULE " -o ") - set( CMAKE_CXX_LINK_EXECUTABLE " -o " ) +if( EXISTS "${__libstl}" OR EXISTS "${__libsupcxx}" ) + if( ANDROID_STL MATCHES "gnustl" ) + set( CMAKE_CXX_CREATE_SHARED_LIBRARY " -o " ) + set( CMAKE_CXX_CREATE_SHARED_MODULE " -o " ) + set( CMAKE_CXX_LINK_EXECUTABLE " -o " ) + else() + set( CMAKE_CXX_CREATE_SHARED_LIBRARY " -o " ) + set( CMAKE_CXX_CREATE_SHARED_MODULE " -o " ) + set( CMAKE_CXX_LINK_EXECUTABLE " -o " ) + endif() + if ( X86 AND ANDROID_STL MATCHES "gnustl" AND ANDROID_NDK_RELEASE STREQUAL "r6" ) + # workaround "undefined reference to `__dso_handle'" problem + set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} \"${ANDROID_SYSROOT}/usr/lib/crtbegin_so.o\"" ) + set( CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE} \"${ANDROID_SYSROOT}/usr/lib/crtbegin_so.o\"" ) + endif() if( EXISTS "${__libstl}" ) - set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} \"${__libstl}\"") - set( CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE} \"${__libstl}\"") - set( CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_CXX_LINK_EXECUTABLE} \"${__libstl}\"") + set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} \"${__libstl}\"" ) + set( CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE} \"${__libstl}\"" ) + set( CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_CXX_LINK_EXECUTABLE} \"${__libstl}\"" ) endif() if( EXISTS "${__libsupcxx}" ) - set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} \"${__libsupcxx}\"") - set( CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE} \"${__libsupcxx}\"") - set( CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_CXX_LINK_EXECUTABLE} \"${__libsupcxx}\"") + set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} \"${__libsupcxx}\"" ) + set( CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE} \"${__libsupcxx}\"" ) + set( CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_CXX_LINK_EXECUTABLE} \"${__libsupcxx}\"" ) # C objects: set( CMAKE_C_CREATE_SHARED_LIBRARY " -o " ) set( CMAKE_C_CREATE_SHARED_MODULE " -o " ) set( CMAKE_C_LINK_EXECUTABLE " -o " ) - set( CMAKE_C_CREATE_SHARED_LIBRARY "${CMAKE_C_CREATE_SHARED_LIBRARY} \"${__libsupcxx}\"") - set( CMAKE_C_CREATE_SHARED_MODULE "${CMAKE_C_CREATE_SHARED_MODULE} \"${__libsupcxx}\"") - set( CMAKE_C_LINK_EXECUTABLE "${CMAKE_C_LINK_EXECUTABLE} \"${__libsupcxx}\"") + set( CMAKE_C_CREATE_SHARED_LIBRARY "${CMAKE_C_CREATE_SHARED_LIBRARY} \"${__libsupcxx}\"" ) + set( CMAKE_C_CREATE_SHARED_MODULE "${CMAKE_C_CREATE_SHARED_MODULE} \"${__libsupcxx}\"" ) + set( CMAKE_C_LINK_EXECUTABLE "${CMAKE_C_LINK_EXECUTABLE} \"${__libsupcxx}\"" ) endif() endif() +# variables controlling optional build flags +if (ANDROID_NDK_RELEASE STRLESS "r7") + # libGLESv2.so in NDK's prior to r7 refers to missing external symbols. + # So this flag option is required for all projects using OpenGL from native. + __INIT_VARIABLE( ANDROID_SO_UNDEFINED VALUES ON ) +else() + __INIT_VARIABLE( ANDROID_SO_UNDEFINED VALUES OFF ) +endif() +__INIT_VARIABLE( ANDROID_NO_UNDEFINED OBSOLETE_NO_UNDEFINED VALUES ON ) +__INIT_VARIABLE( ANDROID_FUNCTION_LEVEL_LINKING VALUES ON ) +__INIT_VARIABLE( ANDROID_GOLD_LINKER VALUES ON ) +__INIT_VARIABLE( ANDROID_NOEXECSTACK VALUES ON ) +__INIT_VARIABLE( ANDROID_RELRO VALUES ON ) + +set( ANDROID_NO_UNDEFINED ${ANDROID_NO_UNDEFINED} CACHE BOOL "Show all undefined symbols as linker errors" ) +set( ANDROID_SO_UNDEFINED ${ANDROID_SO_UNDEFINED} CACHE BOOL "Allows or disallows undefined symbols in shared libraries" ) +set( ANDROID_FUNCTION_LEVEL_LINKING ${ANDROID_FUNCTION_LEVEL_LINKING} CACHE BOOL "Allows or disallows undefined symbols in shared libraries" ) +set( ANDROID_GOLD_LINKER ${ANDROID_GOLD_LINKER} CACHE BOOL "Enables gold linker (only avaialble for NDK r8b for ARM and x86 architectures on linux-86 and darwin-x86 hosts)" ) +set( ANDROID_NOEXECSTACK ${ANDROID_NOEXECSTACK} CACHE BOOL "Allows or disallows undefined symbols in shared libraries" ) +set( ANDROID_RELRO ${ANDROID_RELRO} CACHE BOOL "Enables RELRO - a memory corruption mitigation technique" ) +mark_as_advanced( ANDROID_NO_UNDEFINED ANDROID_SO_UNDEFINED ANDROID_FUNCTION_LEVEL_LINKING ANDROID_GOLD_LINKER ANDROID_NOEXECSTACK ANDROID_RELRO ) + # linker flags set( ANDROID_LINKER_FLAGS "" ) -__INIT_VARIABLE( ANDROID_NO_UNDEFINED OBSOLETE_NO_UNDEFINED VALUES ON ) -set( ANDROID_NO_UNDEFINED ${ANDROID_NO_UNDEFINED} CACHE BOOL "Show all undefined symbols as linker errors" FORCE ) -mark_as_advanced( ANDROID_NO_UNDEFINED ) +if( ARMEABI_V7A ) + # this is *required* to use the following linker flags that routes around + # a CPU bug in some Cortex-A8 implementations: + set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,--fix-cortex-a8" ) +endif() + if( ANDROID_NO_UNDEFINED ) - set( ANDROID_LINKER_FLAGS "-Wl,--no-undefined ${ANDROID_LINKER_FLAGS}" ) + set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,--no-undefined" ) endif() -if (ANDROID_NDK_RELEASE STRLESS "r7") - # libGLESv2.so in NDK's prior to r7 refers to missing external symbols. - # So this flag option is required for all projects using OpenGL from native. - __INIT_VARIABLE( ANDROID_SO_UNDEFINED VALUES ON ) -else() - __INIT_VARIABLE( ANDROID_SO_UNDEFINED VALUES OFF ) -endif() - -set( ANDROID_SO_UNDEFINED ${ANDROID_SO_UNDEFINED} CACHE BOOL "Allows or disallows undefined symbols in shared libraries" FORCE ) -mark_as_advanced( ANDROID_SO_UNDEFINED ) if( ANDROID_SO_UNDEFINED ) set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,-allow-shlib-undefined" ) endif() -__INIT_VARIABLE( ANDROID_FUNCTION_LEVEL_LINKING VALUES ON ) -set( ANDROID_FUNCTION_LEVEL_LINKING ${ANDROID_FUNCTION_LEVEL_LINKING} CACHE BOOL "Allows or disallows undefined symbols in shared libraries" FORCE ) -mark_as_advanced( ANDROID_FUNCTION_LEVEL_LINKING ) if( ANDROID_FUNCTION_LEVEL_LINKING ) - set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fdata-sections -ffunction-sections" ) - set( ANDROID_LINKER_FLAGS "-Wl,--gc-sections ${ANDROID_LINKER_FLAGS}" ) + set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fdata-sections -ffunction-sections" ) + set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,--gc-sections" ) endif() -if( ARMEABI_V7A ) - # this is *required* to use the following linker flags that routes around - # a CPU bug in some Cortex-A8 implementations: - set( ANDROID_LINKER_FLAGS "-Wl,--fix-cortex-a8 ${ANDROID_LINKER_FLAGS}" ) +if( ANDROID_GOLD_LINKER AND CMAKE_HOST_UNIX AND (ARMEABI OR ARMEABI_V7A OR X86) AND ANDROID_COMPILER_VERSION VERSION_EQUAL "4.6" ) + set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -fuse-ld=gold" ) +elseif( ANDROID_NDK_RELEASE STREQUAL "r8b" AND ARMEABI AND ANDROID_COMPILER_VERSION VERSION_EQUAL "4.6" AND NOT _CMAKE_IN_TRY_COMPILE ) + message( WARNING "The default bfd linker from arm GCC 4.6 toolchain can fail with 'unresolvable R_ARM_THM_CALL relocation' error message. See https://code.google.com/p/android/issues/detail?id=35342 + On Linux and OS X host platform you can workaround this problem using gold linker (default). + Rerun cmake with -DANDROID_GOLD_LINKER=ON option. +" ) endif() -if( CMAKE_HOST_UNIX AND ANDROID_COMPILER_VERSION VERSION_EQUAL "4.6" AND (ARMEABI_V7A OR X86) ) - __INIT_VARIABLE( ANDROID_USE_GOLD_LINKER VALUES ON ) - set( ANDROID_USE_GOLD_LINKER ${ANDROID_USE_GOLD_LINKER} CACHE BOOL "Enables gold linker" FORCE ) - mark_as_advanced( ANDROID_USE_GOLD_LINKER ) - if( ANDROID_USE_GOLD_LINKER ) - set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -fuse-ld=gold" ) - endif() +if( ANDROID_NOEXECSTACK ) + set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -Wa,--noexecstack" ) + set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,-z,noexecstack" ) +endif() + +if( ANDROID_RELRO ) + set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,-z,relro -Wl,-z,now" ) endif() # cache flags -set( CMAKE_CXX_FLAGS "${_CMAKE_CXX_FLAGS}" CACHE STRING "c++ flags" ) -set( CMAKE_C_FLAGS "${_CMAKE_C_FLAGS}" CACHE STRING "c flags" ) -set( CMAKE_CXX_FLAGS_RELEASE "${_CMAKE_CXX_FLAGS_RELEASE}" CACHE STRING "c++ Release flags" ) -set( CMAKE_C_FLAGS_RELEASE "${_CMAKE_C_FLAGS_RELEASE}" CACHE STRING "c Release flags" ) -set( CMAKE_CXX_FLAGS_DEBUG "${_CMAKE_CXX_FLAGS_DEBUG}" CACHE STRING "c++ Debug flags" ) -set( CMAKE_C_FLAGS_DEBUG "${_CMAKE_C_FLAGS_DEBUG}" CACHE STRING "c Debug flags" ) -set( CMAKE_SHARED_LINKER_FLAGS "" CACHE STRING "linker flags" ) -set( CMAKE_MODULE_LINKER_FLAGS "" CACHE STRING "linker flags" ) -set( CMAKE_EXE_LINKER_FLAGS "-Wl,-z,nocopyreloc" CACHE STRING "linker flags" ) +set( CMAKE_CXX_FLAGS "" CACHE STRING "c++ flags" ) +set( CMAKE_C_FLAGS "" CACHE STRING "c flags" ) +set( CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "c++ Release flags" ) +set( CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "c Release flags" ) +set( CMAKE_CXX_FLAGS_DEBUG "-O0 -g -DDEBUG -D_DEBUG" CACHE STRING "c++ Debug flags" ) +set( CMAKE_C_FLAGS_DEBUG "-O0 -g -DDEBUG -D_DEBUG" CACHE STRING "c Debug flags" ) +set( CMAKE_SHARED_LINKER_FLAGS "" CACHE STRING "shared linker flags" ) +set( CMAKE_MODULE_LINKER_FLAGS "" CACHE STRING "module linker flags" ) +set( CMAKE_EXE_LINKER_FLAGS "-Wl,-z,nocopyreloc" CACHE STRING "executable linker flags" ) # finish flags -set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS}" CACHE INTERNAL "Extra Android compiler flags" ) -set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS}" CACHE INTERNAL "Extra Android linker flags" ) set( CMAKE_CXX_FLAGS "${ANDROID_CXX_FLAGS} ${CMAKE_CXX_FLAGS}" ) set( CMAKE_C_FLAGS "${ANDROID_CXX_FLAGS} ${CMAKE_C_FLAGS}" ) +set( CMAKE_CXX_FLAGS_RELEASE "${ANDROID_CXX_FLAGS_RELEASE} ${CMAKE_CXX_FLAGS_RELEASE}" ) +set( CMAKE_C_FLAGS_RELEASE "${ANDROID_CXX_FLAGS_RELEASE} ${CMAKE_C_FLAGS_RELEASE}" ) +set( CMAKE_CXX_FLAGS_DEBUG "${ANDROID_CXX_FLAGS_DEBUG} ${CMAKE_CXX_FLAGS_DEBUG}" ) +set( CMAKE_C_FLAGS_DEBUG "${ANDROID_CXX_FLAGS_DEBUG} ${CMAKE_C_FLAGS_DEBUG}" ) +set( CMAKE_SHARED_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}" ) +set( CMAKE_MODULE_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS}" ) +set( CMAKE_EXE_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}" ) + if( MIPS AND BUILD_WITH_ANDROID_NDK AND ANDROID_NDK_RELEASE STREQUAL "r8" ) - set( CMAKE_SHARED_LINKER_FLAGS "-Wl,-T,${ANDROID_NDK}/toolchains/${ANDROID_TOOLCHAIN_NAME}/mipself.xsc ${ANDROID_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}" ) - set( CMAKE_MODULE_LINKER_FLAGS "-Wl,-T,${ANDROID_NDK}/toolchains/${ANDROID_TOOLCHAIN_NAME}/mipself.xsc ${ANDROID_LINKER_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS}" ) - set( CMAKE_EXE_LINKER_FLAGS "-Wl,-T,${ANDROID_NDK}/toolchains/${ANDROID_TOOLCHAIN_NAME}/mipself.x ${ANDROID_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}" ) -else() - set( CMAKE_SHARED_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}" ) - set( CMAKE_MODULE_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS}" ) - set( CMAKE_EXE_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}" ) + set( CMAKE_SHARED_LINKER_FLAGS "-Wl,-T,${ANDROID_NDK}/toolchains/${ANDROID_TOOLCHAIN_NAME}/mipself.xsc ${CMAKE_SHARED_LINKER_FLAGS}" ) + set( CMAKE_MODULE_LINKER_FLAGS "-Wl,-T,${ANDROID_NDK}/toolchains/${ANDROID_TOOLCHAIN_NAME}/mipself.xsc ${CMAKE_MODULE_LINKER_FLAGS}" ) + set( CMAKE_EXE_LINKER_FLAGS "-Wl,-T,${ANDROID_NDK}/toolchains/${ANDROID_TOOLCHAIN_NAME}/mipself.x ${CMAKE_EXE_LINKER_FLAGS}" ) endif() # configure rtti if( DEFINED ANDROID_RTTI AND ANDROID_STL_FORCE_FEATURES ) if( ANDROID_RTTI ) - set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -frtti" ) + set( CMAKE_CXX_FLAGS "-frtti ${CMAKE_CXX_FLAGS}" ) else() - set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti" ) + set( CMAKE_CXX_FLAGS "-fno-rtti ${CMAKE_CXX_FLAGS}" ) endif() endif() # configure exceptios if( DEFINED ANDROID_EXCEPTIONS AND ANDROID_STL_FORCE_FEATURES ) if( ANDROID_EXCEPTIONS ) - set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexceptions" ) - set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fexceptions" ) + set( CMAKE_CXX_FLAGS "-fexceptions ${CMAKE_CXX_FLAGS}" ) + set( CMAKE_C_FLAGS "-fexceptions ${CMAKE_C_FLAGS}" ) else() - set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions" ) - set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-exceptions" ) + set( CMAKE_CXX_FLAGS "-fno-exceptions ${CMAKE_CXX_FLAGS}" ) + set( CMAKE_C_FLAGS "-fno-exceptions ${CMAKE_C_FLAGS}" ) endif() endif() # global includes and link directories -if( ANDROID_STL_INCLUDE_DIRS ) - include_directories( SYSTEM ${ANDROID_STL_INCLUDE_DIRS} ) -endif() +include_directories( SYSTEM "${ANDROID_SYSROOT}/usr/include" ${ANDROID_STL_INCLUDE_DIRS} ) link_directories( "${CMAKE_INSTALL_PREFIX}/libs/${ANDROID_NDK_ABI_NAME}" ) - # set these global flags for cmake client scripts to change behavior set( ANDROID True ) set( BUILD_ANDROID True ) @@ -1242,11 +1268,13 @@ macro( ANDROID_GET_ABI_RAWNAME TOOLCHAIN_FLAG VAR ) if( "${TOOLCHAIN_FLAG}" STREQUAL "ARMEABI" ) set( ${VAR} "armeabi" ) elseif( "${TOOLCHAIN_FLAG}" STREQUAL "ARMEABI_V7A" ) - set( ${VAR} "armeabi-v7a" ) + set( ${VAR} "armeabi-v7a" ) elseif( "${TOOLCHAIN_FLAG}" STREQUAL "X86" ) - set( ${VAR} "x86" ) + set( ${VAR} "x86" ) + elseif( "${TOOLCHAIN_FLAG}" STREQUAL "MIPS" ) + set( ${VAR} "mips" ) else() - set( ${VAR} "unknown" ) + set( ${VAR} "unknown" ) endif() endmacro() @@ -1254,10 +1282,22 @@ endmacro() # export toolchain settings for the try_compile() command if( NOT PROJECT_NAME STREQUAL "CMAKE_TRY_COMPILE" ) set( __toolchain_config "") - foreach( __var NDK_CCACHE ANDROID_ABI ANDROID_FORCE_ARM_BUILD ANDROID_NATIVE_API_LEVEL ANDROID_NO_UNDEFINED - ANDROID_SO_UNDEFINED ANDROID_SET_OBSOLETE_VARIABLES LIBRARY_OUTPUT_PATH_ROOT ANDROID_STL - ANDROID_STL_FORCE_FEATURES ANDROID_FORBID_SYGWIN ANDROID_NDK ANDROID_STANDALONE_TOOLCHAIN - ANDROID_FUNCTION_LEVEL_LINKING ANDROID_USE_GOLD_LINKER ) + foreach( __var NDK_CCACHE LIBRARY_OUTPUT_PATH_ROOT ANDROID_FORBID_SYGWIN ANDROID_SET_OBSOLETE_VARIABLES + ANDROID_NDK + ANDROID_STANDALONE_TOOLCHAIN + ANDROID_TOOLCHAIN_NAME + ANDROID_ABI + ANDROID_NATIVE_API_LEVEL + ANDROID_STL + ANDROID_STL_FORCE_FEATURES + ANDROID_FORCE_ARM_BUILD + ANDROID_NO_UNDEFINED + ANDROID_SO_UNDEFINED + ANDROID_FUNCTION_LEVEL_LINKING + ANDROID_GOLD_LINKER + ANDROID_NOEXECSTACK + ANDROID_RELRO + ) if( DEFINED ${__var} ) if( "${__var}" MATCHES " ") set( __toolchain_config "${__toolchain_config}set( ${__var} \"${${__var}}\" CACHE INTERNAL \"\" )\n" ) @@ -1289,7 +1329,9 @@ endif() # ANDROID_NO_UNDEFINED : ON/OFF # ANDROID_SO_UNDEFINED : OFF/ON (default depends on NDK version) # ANDROID_FUNCTION_LEVEL_LINKING : ON/OFF -# ANDROID_USE_GOLD_LINKER : ON/OFF (default depends on NDK version and host & target platforms) +# ANDROID_GOLD_LINKER : ON/OFF +# ANDROID_NOEXECSTACK : ON/OFF +# ANDROID_RELRO : ON/OFF # Variables that takes effect only at first run: # ANDROID_FORCE_ARM_BUILD : ON/OFF # ANDROID_STL : gnustl_static/gnustl_shared/stlport_static/stlport_shared/gabi++_static/gabi++_shared/system_re/system/none diff --git a/android/scripts/ABI_compat_generator.py b/android/scripts/ABI_compat_generator.py new file mode 100755 index 0000000000..638c690ea2 --- /dev/null +++ b/android/scripts/ABI_compat_generator.py @@ -0,0 +1,130 @@ +#!/usr/bin/python + +import os +import sys + +ANDROID_SDK_PATH = "/opt/android-sdk-linux" +ANDROID_NDK_PATH = None +INSTALL_DIRECTORY = None +CLASS_PATH = None +TMP_HEADER_PATH="tmp_include" +HEADER_EXTS = set(['h', 'hpp']) +SYS_INCLUDES = ["platforms/android-8/arch-arm/usr/include", "sources/cxx-stl/gnu-libstdc++/include", "sources/cxx-stl/gnu-libstdc++/libs/armeabi/include"] + +PROJECT_NAME = "OpenCV-branch" +TARGET_LIBS = ["libopencv_java.so"] +ARCH = "armeabi" +GCC_OPTIONS = "-fpermissive" +EXCLUDE_HEADERS = set(["hdf5.h", "eigen.hpp", "cxeigen.hpp"]); + +def FindClasses(root, prefix): + classes = [] + if ("" != prefix): + prefix = prefix + "." + for path in os.listdir(root): + currentPath = os.path.join(root, path) + if (os.path.isdir(currentPath)): + classes += FindClasses(currentPath, prefix + path) + else: + name = str.split(path, ".")[0] + ext = str.split(path, ".")[1] + if (ext == "class"): + #print("class: %s" % (prefix + name)) + classes.append(prefix+name) + return classes + +def FindHeaders(root): + headers = [] + for path in os.listdir(root): + currentPath = os.path.join(root, path) + if (os.path.isdir(currentPath)): + headers += FindHeaders(currentPath) + else: + ext = str.split(path, ".")[-1] + #print("%s: \"%s\"" % (currentPath, ext)) + if (ext in HEADER_EXTS): + #print("Added as header file") + if (path not in EXCLUDE_HEADERS): + headers.append(currentPath) + return headers + +if (len(sys.argv) < 3): + print("Error: Invalid command line arguments") + exit(-1) + +INSTALL_DIRECTORY = sys.argv[1] +PROJECT_NAME = sys.argv[2] + +CLASS_PATH = os.path.join(INSTALL_DIRECTORY, "sdk/java/bin/classes") +if (not os.path.exists(CLASS_PATH)): + print("Error: no java classes found in \"%s\"", CLASS_PATH) + exit(-2) + +if (os.environ.has_key("NDK_ROOT")): + ANDROID_NDK_PATH = os.environ["NDK_ROOT"]; + print("Using Android NDK from NDK_ROOT (\"%s\")" % ANDROID_NDK_PATH) + + +if (not ANDROID_NDK_PATH): + pipe = os.popen("which ndk-build") + tmp = str.strip(pipe.readline(), "\n") + while(not tmp): + tmp = str.strip(pipe.readline(), "\n") + pipe.close() + ANDROID_NDK_PATH = tmp + print("Using Android NDK from PATH (\"%s\")" % ANDROID_NDK_PATH) + +print("Using Android SDK from \"%s\"" % ANDROID_SDK_PATH) + +outputFileName = PROJECT_NAME + ".xml" +try: + outputFile = open(outputFileName, "w") +except: + print("Error: Cannot open output file \"%s\" for writing" % outputFileName) + +allJavaClasses = FindClasses(CLASS_PATH, "") +if (not allJavaClasses): + print("Error: No Java classes found :(") + exit(-1) + +if (not os.path.exists(TMP_HEADER_PATH)): + os.makedirs(os.path.join(os.getcwd(), TMP_HEADER_PATH)) + +print("Generating JNI headers for Java API ...") +AndroidJavaDeps = os.path.join(ANDROID_SDK_PATH, "platforms/android-11/android.jar") +for currentClass in allJavaClasses: + os.system("javah -d %s -classpath %s:%s %s" % (TMP_HEADER_PATH, CLASS_PATH, AndroidJavaDeps, currentClass)) + +print("Building JNI headers list ...") +jniHeaders = FindHeaders(TMP_HEADER_PATH) +#print(jniHeaders) + +print("Building Native OpenCV header list ...") +cHeaders = FindHeaders(os.path.join(INSTALL_DIRECTORY, "sdk/native/jni/include/opencv")) +cppHeaders = FindHeaders(os.path.join(INSTALL_DIRECTORY, "sdk/native/jni/include/opencv2")) +#print(cHeaders) +#print(cppHeaders) + +print("Writing config file ...") +outputFile.write("\n\n\n\t%s\n\n\n\n" % PROJECT_NAME) +outputFile.write("\t" + "\n\t".join(cHeaders)) +outputFile.write("\n\t" + "\n\t".join(cppHeaders)) +outputFile.write("\n\t" + "\n\t".join(jniHeaders)) +outputFile.write("\n\n\n") + +includes = [] +for inc in SYS_INCLUDES: + includes.append(os.path.join(ANDROID_NDK_PATH, inc)) + +outputFile.write("\n\tOpenCV-2.4.2-branch/sdk/native/jni/include\n\tOpenCV-2.4.2-branch/sdk/native/jni/include/opencv\n\tOpenCV-2.4.2-branch/sdk/native/jni/include/opencv2\n") + +outputFile.write("\t%s\n\n\n" % "\n\t".join(includes)) + +libraries = [] +for lib in TARGET_LIBS: + libraries.append(os.path.join(INSTALL_DIRECTORY, "sdk/native/libs", ARCH, lib)) + +outputFile.write("\n\t%s\n\n\n" % "\n\t".join(libraries)) +outputFile.write("\n\t%s\n\n\n" % GCC_OPTIONS) + +print("done!") diff --git a/android/scripts/camera_build.conf b/android/scripts/camera_build.conf new file mode 100644 index 0000000000..35eaac33b3 --- /dev/null +++ b/android/scripts/camera_build.conf @@ -0,0 +1,17 @@ +# make target; arch; API level; Android Source Code Root +native_camera_r2.2.0; armeabi; 8; /home/alexander/Projects/AndroidSource/2.2.2 +native_camera_r2.2.0; armeabi-v7a; 8; /home/alexander/Projects/AndroidSource/2.2.2 +native_camera_r2.3.3; armeabi; 9; /home/alexander/Projects/AndroidSource/2.3.3 +native_camera_r2.3.3; armeabi-v7a; 9; /home/alexander/Projects/AndroidSource/2.3.3 +native_camera_r2.3.3; x86; 9; /home/alexander/Projects/AndroidSource/2.3.3 +native_camera_r3.0.1; armeabi; 9; /home/alexander/Projects/AndroidSource/3.0.1 +native_camera_r3.0.1; armeabi-v7a; 9; /home/alexander/Projects/AndroidSource/3.0.1 +native_camera_r3.0.1; x86; 9; /home/alexander/Projects/AndroidSource/3.0.1 +native_camera_r4.0.3; armeabi; 14; /home/alexander/Projects/AndroidSource/4.0.3 +native_camera_r4.0.3; armeabi-v7a; 14; /home/alexander/Projects/AndroidSource/4.0.3 +native_camera_r4.0.3; x86; 14; /home/alexander/Projects/AndroidSource/4.0.3 +native_camera_r4.0.0; armeabi; 14; /home/alexander/Projects/AndroidSource/4.0.0 +native_camera_r4.0.0; armeabi-v7a; 14; /home/alexander/Projects/AndroidSource/4.0.0 +native_camera_r4.1.1; armeabi; 14; /home/alexander/Projects/AndroidSource/4.1.1 +native_camera_r4.1.1; armeabi-v7a; 14; /home/alexander/Projects/AndroidSource/4.1.1 +native_camera_r4.1.1; x86; 14; /home/alexander/Projects/AndroidSource/4.1.1 diff --git a/android/scripts/cmake_android_all_cameras.py b/android/scripts/cmake_android_all_cameras.py new file mode 100755 index 0000000000..3221ab6d3f --- /dev/null +++ b/android/scripts/cmake_android_all_cameras.py @@ -0,0 +1,54 @@ +#!/usr/bin/python + +import os +import sys +import shutil + +ScriptHome = os.path.split(sys.argv[0])[0] +ConfFile = open(os.path.join(ScriptHome, "camera_build.conf"), "rt") +HomeDir = os.getcwd() +for s in ConfFile.readlines(): + s = s[0:s.find("#")] + if (not s): + continue + keys = s.split(";") + if (len(keys) < 4): + print("Error: invalid config line: \"%s\"" % s) + continue + MakeTarget = str.strip(keys[0]) + Arch = str.strip(keys[1]) + NativeApiLevel = str.strip(keys[2]) + AndroidTreeRoot = str.strip(keys[3]) + AndroidTreeRoot = str.strip(AndroidTreeRoot, "\n") + print("Building %s for %s" % (MakeTarget, Arch)) + BuildDir = os.path.join(HomeDir, MakeTarget + "_" + Arch) + if (os.path.exists(BuildDir)): + shutil.rmtree(BuildDir) + try: + os.mkdir(BuildDir) + except: + print("Error: cannot create direcotry \"%s\"" % BuildDir) + continue + shutil.rmtree(os.path.join(AndroidTreeRoot, "out", "target", "product", "generic", "system"), ignore_errors=True) + if (Arch == "x86"): + shutil.copytree(os.path.join(AndroidTreeRoot, "bin_x86", "system"), os.path.join(AndroidTreeRoot, "out", "target", "product", "generic", "system")) + else: + shutil.copytree(os.path.join(AndroidTreeRoot, "bin_arm", "system"), os.path.join(AndroidTreeRoot, "out", "target", "product", "generic", "system")) + os.chdir(BuildDir) + BuildLog = os.path.join(BuildDir, "build.log") + CmakeCmdLine = "cmake -DCMAKE_TOOLCHAIN_FILE=../android.toolchain.cmake -DANDROID_SOURCE_TREE=\"%s\" -DANDROID_NATIVE_API_LEVEL=\"%s\" -DANDROID_ABI=\"%s\" -DANDROID_USE_STLPORT=ON ../../ > \"%s\" 2>&1" % (AndroidTreeRoot, NativeApiLevel, Arch, BuildLog) + MakeCmdLine = "make %s >> \"%s\" 2>&1" % (MakeTarget, BuildLog); + #print(CmakeCmdLine) + os.system(CmakeCmdLine) + #print(MakeCmdLine) + os.system(MakeCmdLine) + os.chdir(HomeDir) + CameraLib = os.path.join(BuildDir, "lib", Arch, "lib" + MakeTarget + ".so") + if (os.path.exists(CameraLib)): + try: + shutil.copyfile(CameraLib, os.path.join("..", "3rdparty", "lib", Arch, "lib" + MakeTarget + ".so")) + print("Building %s for %s\t[OK]" % (MakeTarget, Arch)); + except: + print("Building %s for %s\t[FAILED]" % (MakeTarget, Arch)); +ConfFile.close() + diff --git a/android/service/doc/BaseLoaderCallback.rst b/android/service/doc/BaseLoaderCallback.rst index b4ccf6fff6..e30f7c0d1c 100644 --- a/android/service/doc/BaseLoaderCallback.rst +++ b/android/service/doc/BaseLoaderCallback.rst @@ -5,7 +5,7 @@ Base Loader Callback Interface implementation .. highlight:: java .. class:: BaseLoaderCallback - Basic implementation of LoaderCallbackInterface. Implementation logic is described by diagram. + Basic implementation of LoaderCallbackInterface. Logic of this implementation is well-described by the following scheme: .. image:: img/AndroidAppUsageModel.png diff --git a/android/service/doc/InstallCallbackInterface.rst b/android/service/doc/InstallCallbackInterface.rst index d0044b9f9c..56a1961ff9 100644 --- a/android/service/doc/InstallCallbackInterface.rst +++ b/android/service/doc/InstallCallbackInterface.rst @@ -11,21 +11,21 @@ String getPackageName() .. method:: String getPackageName() - Get name of a package to be installed + Get name of a package to be installed. - :rtype: String - :return: Return package name, i.e. "OpenCV Manager Service" or "OpenCV library" + :rtype: string; + :return: returns package name, i.e. "OpenCV Manager Service" or "OpenCV library". void install() -------------- .. method:: void install() - Installation of package is approved + Installation of package has been approved. void cancel() ------------- .. method:: void cancel() - Installation if package was canceled + Installation if package has been canceled. diff --git a/android/service/doc/Intro.rst b/android/service/doc/Intro.rst index 452fc5be8a..f46f3d21f3 100644 --- a/android/service/doc/Intro.rst +++ b/android/service/doc/Intro.rst @@ -9,7 +9,7 @@ Introduction OpenCV Manager is an Android service targeted to manage OpenCV library binaries on end users devices. It allows sharing the OpenCV dynamic libraries of different versions between applications on the same device. The Manager provides the following benefits\: -#. Less memory usage. All apps use the same binaries from service and do not keep native libs inside them self; +#. Less memory usage. All apps use the same binaries from service and do not keep native libs inside themselves; #. Hardware specific optimizations for all supported platforms; #. Trusted OpenCV library source. All packages with OpenCV are published on Google Play service; #. Regular updates and bug fixes; @@ -21,18 +21,18 @@ Usage model for target user First OpenCV app\: -#. User downloads app dependent from OpenCV from Google Play or installs it manually; -#. User starts application. Application asks user to install OpenCV Manager; -#. User installs OpenCV Manager from Google Play Service; -#. User starts application. Application proposes to user to install OpenCV library for target device and runs Google Play; -#. User runs app in the third time and gets what he or she wants. +#. Any OpenCV-dependent app is installed from Google Play marketplace or manually; +#. At the first launch, it suggests installing OpenCV Manager; +#. Then OpenCV Manager is downloaded and installed, using Google Play marketplace service. +#. When started, the application suggests installing OpenCV library for the target device trough Google Play marketplace; +#. After installation is finished, the app may be launched to perform common tasks. Next OpenCV app\: -#. User downloads app dependent from OpenCV from Google Play or installs it manually; -#. User starts application. -#. If selected version is not installed Manager asks user to install OpenCV library package and runs Google Play; -#. User runs app in the second time and gets what he or she wants. +#. Any OpenCV-dependent app is installed from Google Play marketplace or manually; +#. At the first launch, the app starts as usually; +#. If the selected version is not installed, OpenCV Manager suggests installing OpenCV library for the target device trough Google Play marketplace; +#. After installation is finished, the app may be launched to perform common tasks. OpenCV Manager structure ------------------------ diff --git a/android/service/doc/JavaHelper.rst b/android/service/doc/JavaHelper.rst index 9409231b0c..f4f4483907 100644 --- a/android/service/doc/JavaHelper.rst +++ b/android/service/doc/JavaHelper.rst @@ -5,32 +5,33 @@ Java OpenCV Loader .. highlight:: java .. Class:: OpenCVLoader -Helper class provides common initialization methods for OpenCV library +Helper class provides common initialization methods for OpenCV library. boolean initDebug() ------------------- .. method:: static boolean initDebug() - Load and initialize OpenCV library from current application package. Roughly it is analog of system.loadLibrary("opencv_java") + Loads and initializes OpenCV library from within current application package. Roughly it is analog of ``system.loadLibrary("opencv_java")``. - :rtype: boolean - :return: Return true if initialization of OpenCV was successful + :rtype: boolean; + :return: returns true if initialization of OpenCV was successful. -.. note:: This way is deprecated for production code. It is designed for experimantal and local development purposes only. If you want to publish your app use approach with async initialization +.. note:: This method is deprecated for production code. It is designed for experimantal and local development purposes only. If you want to publish your app use approach with async initialization. boolean initAsync() ------------------- .. method:: static boolean initAsync(String Version, Context AppContext, LoaderCallbackInterface Callback) - Load and initialize OpenCV library using OpenCV Manager service. + Loads and initializes OpenCV library using OpenCV Manager service. - :param Version: OpenCV Library version - :param AppContext: Application context for connecting to service - :param Callback: Object, that implements LoaderCallbackInterface for handling Connection status. See BaseLoaderCallback. - :rtype: boolean - :return: Return true if initialization of OpenCV starts successfully + :param Version: OpenCV Library version. + :param AppContext: application context for connecting to the service. + :param Callback: object, that implements LoaderCallbackInterface for handling connection status (see BaseLoaderCallback). + + :rtype: boolean; + :return: returns true if initialization of OpenCV starts successfully. OpenCV version constants ------------------------- diff --git a/android/service/doc/LoaderCallbackInterface.rst b/android/service/doc/LoaderCallbackInterface.rst index 5a88e599fa..5e23617a44 100644 --- a/android/service/doc/LoaderCallbackInterface.rst +++ b/android/service/doc/LoaderCallbackInterface.rst @@ -5,32 +5,32 @@ Loader Callback Interface .. highlight:: java .. class:: LoaderCallbackInterface - Interface for callback object in case of asynchronous initialization of OpenCV + Interface for a callback object in case of asynchronous initialization of OpenCV. void onManagerConnected() ------------------------- .. method:: void onManagerConnected(int status) - Callback method that is called after OpenCV library initialization + Callback method that is called after OpenCV Library initialization. - :param status: Status of initialization. See Initialization status constants + :param status: status of initialization (see Initialization Status Constants). void onPackageInstall() ----------------------- .. method:: void onPackageInstall(InstallCallbackInterface Callback) - Callback method that is called in case when package installation is needed + Callback method that is called in case when package installation is needed. - :param callback: Answer object with approve and cancel methods and package description + :param callback: answer object with approve and cancel methods and package description. Initialization status constants ------------------------------- .. data:: SUCCESS - OpenCV initialization finished successfully + OpenCV initialization finished successfully. .. data:: RESTART_REQUIRED diff --git a/android/service/doc/UseCases.rst b/android/service/doc/UseCases.rst index 1d42c66d54..ac3a6bf84c 100644 --- a/android/service/doc/UseCases.rst +++ b/android/service/doc/UseCases.rst @@ -5,25 +5,25 @@ Engine use Cases First application start ----------------------- -There is no OpenCV Manager and OpenCV libraries. +There is no OpenCV Manager or OpenCV libraries: .. image:: img/NoService.png Second application start ------------------------ -There is OpenCV Manager service, but there is no OpenCV library. -If OpenCV library installation approved\: +There is an OpenCV Manager service, but there is no OpenCV library. +If OpenCV library installation has been approved\: .. image:: img/LibInstallAproved.png -If OpenCV library installation canceled\: +If OpenCV library installation has been canceled\: .. image:: img/LibInstallCanceled.png Regular application start ------------------------- -OpenCV Manager and OpenCV library has bee already installed. +OpenCV Manager and OpenCV library has been already installed. .. image:: img/LibInstalled.png \ No newline at end of file diff --git a/android/service/engine/AndroidManifest.xml b/android/service/engine/AndroidManifest.xml index 5fee38f1b4..4e7e77cc81 100644 --- a/android/service/engine/AndroidManifest.xml +++ b/android/service/engine/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="15" + android:versionName="1.5" > @@ -16,13 +16,16 @@ - - + + - + \ No newline at end of file diff --git a/android/service/engine/jni/BinderComponent/HardwareDetector.h b/android/service/engine/jni/BinderComponent/HardwareDetector.h index ed15134c80..9242143bb0 100644 --- a/android/service/engine/jni/BinderComponent/HardwareDetector.h +++ b/android/service/engine/jni/BinderComponent/HardwareDetector.h @@ -20,7 +20,7 @@ #define FEATURES_HAS_SSSE3 4L #define FEATURES_HAS_GPU 65536L -// TODO: Do not forget to add Platrfom name to PackageInfo::PlatformNameMap +// TODO: Do not forget to add Platrfom name to PackageInfo::PlatformNameMap // in method PackageInfo::InitPlatformNameMap() #define PLATFORM_UNKNOWN 0L #define PLATFORM_TEGRA 1L diff --git a/android/service/engine/jni/BinderComponent/OpenCVEngine.cpp b/android/service/engine/jni/BinderComponent/OpenCVEngine.cpp index f8f7ee4f3c..b1d0779b0e 100644 --- a/android/service/engine/jni/BinderComponent/OpenCVEngine.cpp +++ b/android/service/engine/jni/BinderComponent/OpenCVEngine.cpp @@ -125,23 +125,23 @@ android::String16 OpenCVEngine::GetLibraryList(android::String16 version) if (!tmp.empty()) { tmp += "/libopencvinfo.so"; - + LOGD("Trying to load info library \"%s\"", tmp.c_str()); - + void *handle; char* (*info_func)(); - + handle = dlopen(tmp.c_str(), RTLD_LAZY); if (handle) { const char *error; - - dlerror(); + + dlerror(); *(void **) (&info_func) = dlsym(handle, "GetLibraryList"); if ((error = dlerror()) == NULL) { result = String16((*info_func)()); - dlclose(handle); + dlclose(handle); } else { diff --git a/android/service/engine/jni/BinderComponent/ProcReader.h b/android/service/engine/jni/BinderComponent/ProcReader.h index fd30cdebe8..7b50028fc0 100644 --- a/android/service/engine/jni/BinderComponent/ProcReader.h +++ b/android/service/engine/jni/BinderComponent/ProcReader.h @@ -14,9 +14,9 @@ #define CPU_INFO_SSE2_STR "sse2" #define CPU_INFO_SSSE3_STR "ssse3" -#define CPU_INFO_ARCH_ARMV7_STR "ARMv7" -#define CPU_INFO_ARCH_ARMV6_STR "ARMv6" -#define CPU_INFO_ARCH_ARMV5_STR "ARMv5" +#define CPU_INFO_ARCH_ARMV7_STR "(v7l)" +#define CPU_INFO_ARCH_ARMV6_STR "(v6l)" +#define CPU_INFO_ARCH_ARMV5_STR "(v5l)" #define CPU_INFO_ARCH_X86_STR "x86" diff --git a/android/service/engine/jni/NativeService/CommonPackageManager.cpp b/android/service/engine/jni/NativeService/CommonPackageManager.cpp index 99eb7325c2..3da3e8328f 100644 --- a/android/service/engine/jni/NativeService/CommonPackageManager.cpp +++ b/android/service/engine/jni/NativeService/CommonPackageManager.cpp @@ -15,14 +15,14 @@ set CommonPackageManager::GetInstalledVersions() { set result; vector installed_packages = GetInstalledPackages(); - + for (vector::const_iterator it = installed_packages.begin(); it != installed_packages.end(); ++it) { string version = it->GetVersion(); assert(!version.empty()); result.insert(version); } - + return result; } @@ -33,12 +33,12 @@ bool CommonPackageManager::CheckVersionInstalled(const std::string& version, int PackageInfo target_package(version, platform, cpu_id); LOGD("GetInstalledPackages() call"); vector packages = GetInstalledPackages(); - + for (vector::const_iterator it = packages.begin(); it != packages.end(); ++it) { LOGD("Found package: \"%s\"", it->GetFullName().c_str()); } - + if (!packages.empty()) { result = (packages.end() != find(packages.begin(), packages.end(), target_package)); @@ -60,7 +60,7 @@ string CommonPackageManager::GetPackagePathByVersion(const std::string& version, PackageInfo target_package(version, platform, cpu_id); vector all_packages = GetInstalledPackages(); vector packages; - + for (vector::iterator it = all_packages.begin(); it != all_packages.end(); ++it) { LOGD("Check version \"%s\" compatibility with \"%s\"\n", version.c_str(), it->GetVersion().c_str()); @@ -71,10 +71,10 @@ string CommonPackageManager::GetPackagePathByVersion(const std::string& version, } else { - LOGD("NOT Compatible"); + LOGD("NOT Compatible"); } } - + if (!packages.empty()) { vector::iterator found = find(packages.begin(), packages.end(), target_package); @@ -86,13 +86,13 @@ string CommonPackageManager::GetPackagePathByVersion(const std::string& version, { int OptRating = -1; std::vector >& group = CommonPackageManager::ArmRating; - + if ((cpu_id & ARCH_X86) || (cpu_id & ARCH_X64)) group = CommonPackageManager::IntelRating; - + int HardwareRating = GetHardwareRating(platform, cpu_id, group); LOGD("Current hardware platform %d, %d", platform, cpu_id); - + if (-1 == HardwareRating) { LOGE("Cannot calculate rating for current hardware platform!"); @@ -111,7 +111,7 @@ string CommonPackageManager::GetPackagePathByVersion(const std::string& version, } } } - + if ((-1 != OptRating) && (packages.end() != found)) { result = found->GetInstalationPath(); @@ -123,7 +123,7 @@ string CommonPackageManager::GetPackagePathByVersion(const std::string& version, } } } - + return result; } @@ -131,22 +131,22 @@ bool CommonPackageManager::IsVersionCompatible(const std::string& target_version { assert (target_version.size() == 3); assert (package_version.size() == 3); - + bool result = false; - + // major version is the same and minor package version is above or the same as target. if ((package_version[0] == target_version[0]) && (package_version[1] == target_version[1]) && (package_version[2] >= target_version[2])) { - result = true; + result = true; } - + return result; } int CommonPackageManager::GetHardwareRating(int platform, int cpu_id, const std::vector >& group) { int result = -1; - + for (size_t i = 0; i < group.size(); i++) { if (group[i] == std::pair(platform, cpu_id)) @@ -162,19 +162,23 @@ int CommonPackageManager::GetHardwareRating(int platform, int cpu_id, const std: std::vector > CommonPackageManager::InitArmRating() { std::vector > result; - + result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv5)); result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv6)); result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv6 | FEATURES_HAS_VFPv3d16)); result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv6 | FEATURES_HAS_VFPv3)); - result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv6 | FEATURES_HAS_VFPv3 | FEATURES_HAS_VFPv3d16)); + result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv6 | FEATURES_HAS_VFPv3 | FEATURES_HAS_VFPv3d16)); result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv7)); + result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_VFPv3d16)); result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_VFPv3)); + result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_VFPv3d16 | FEATURES_HAS_VFPv3)); result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_NEON)); + result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_VFPv3d16 | FEATURES_HAS_NEON)); result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_VFPv3 | FEATURES_HAS_NEON)); - result.push_back(std::pair(PLATFORM_TEGRA2, ARCH_ARMv7 | FEATURES_HAS_VFPv3)); + result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_VFPv3 | FEATURES_HAS_VFPv3d16 | FEATURES_HAS_NEON)); + result.push_back(std::pair(PLATFORM_TEGRA2, ARCH_ARMv7 | FEATURES_HAS_VFPv3d16)); result.push_back(std::pair(PLATFORM_TEGRA3, ARCH_ARMv7 | FEATURES_HAS_VFPv3 | FEATURES_HAS_NEON)); - + return result; } diff --git a/android/service/engine/res/layout-small/info.xml b/android/service/engine/res/layout-small/info.xml new file mode 100644 index 0000000000..cd2e874a02 --- /dev/null +++ b/android/service/engine/res/layout-small/info.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/service/engine/res/layout-small/main.xml b/android/service/engine/res/layout-small/main.xml new file mode 100644 index 0000000000..e9cb2685fa --- /dev/null +++ b/android/service/engine/res/layout-small/main.xml @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +