diff --git a/cmake/android/android_gradle_projects.cmake b/cmake/android/android_gradle_projects.cmake index 0a8b9f4b60..a3f4ba2c65 100644 --- a/cmake/android/android_gradle_projects.cmake +++ b/cmake/android/android_gradle_projects.cmake @@ -1,8 +1,8 @@ # https://developer.android.com/studio/releases/gradle-plugin -set(ANDROID_GRADLE_PLUGIN_VERSION "3.2.1" CACHE STRING "Android Gradle Plugin version") +set(ANDROID_GRADLE_PLUGIN_VERSION "7.3.1" CACHE STRING "Android Gradle Plugin version") message(STATUS "Android Gradle Plugin version: ${ANDROID_GRADLE_PLUGIN_VERSION}") -set(KOTLIN_PLUGIN_VERSION "1.4.10" CACHE STRING "Kotlin Plugin version") +set(KOTLIN_PLUGIN_VERSION "1.5.20" CACHE STRING "Kotlin Plugin version") message(STATUS "Kotlin Plugin version: ${KOTLIN_PLUGIN_VERSION}") if(BUILD_KOTLIN_EXTENSIONS) @@ -13,7 +13,7 @@ else() set(KOTLIN_STD_LIB "" CACHE STRING "Kotlin Standard Library dependency") endif() -set(GRADLE_VERSION "5.6.4" CACHE STRING "Gradle version") +set(GRADLE_VERSION "7.6.3" CACHE STRING "Gradle version") message(STATUS "Gradle version: ${GRADLE_VERSION}") set(ANDROID_COMPILE_SDK_VERSION "26" CACHE STRING "Android compileSdkVersion") @@ -22,7 +22,7 @@ if(ANDROID_NATIVE_API_LEVEL GREATER 21) else() set(ANDROID_MIN_SDK_VERSION "21" CACHE STRING "Android minSdkVersion") endif() -set(ANDROID_TARGET_SDK_VERSION "26" CACHE STRING "Android minSdkVersion") +set(ANDROID_TARGET_SDK_VERSION "31" CACHE STRING "Android minSdkVersion") set(ANDROID_BUILD_BASE_DIR "${OpenCV_BINARY_DIR}/opencv_android" CACHE INTERNAL "") set(ANDROID_TMP_INSTALL_BASE_DIR "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/install/opencv_android") @@ -109,21 +109,41 @@ if(NOT OPENCV_SKIP_ANDROID_FORCE_CMAKE) get_filename_component(_CMAKE_INSTALL_DIR "${CMAKE_ROOT}" PATH) get_filename_component(_CMAKE_INSTALL_DIR "${_CMAKE_INSTALL_DIR}" PATH) endif() - ocv_update_file("${ANDROID_BUILD_BASE_DIR}/local.properties" "cmake.dir=${_CMAKE_INSTALL_DIR}") + ocv_update_file("${ANDROID_BUILD_BASE_DIR}/local.properties" "cmake.dir=${_CMAKE_INSTALL_DIR}\nndk.dir=${ANDROID_NDK}") endif() file(WRITE "${ANDROID_BUILD_BASE_DIR}/settings.gradle" " +gradle.ext { + //opencv_source = 'maven_central' + //opencv_source = 'maven_local' + opencv_source = 'sdk_path' +} + include ':opencv' ") file(WRITE "${ANDROID_TMP_INSTALL_BASE_DIR}/settings.gradle" " rootProject.name = 'opencv_samples' -def opencvsdk='../' -//def opencvsdk='/' -//println opencvsdk -include ':opencv' -project(':opencv').projectDir = new File(opencvsdk + '/sdk') +gradle.ext { + //opencv_source = 'maven_central' + //opencv_source = 'maven_local' + opencv_source = 'sdk_path' +} + +if (gradle.opencv_source == 'maven_local') { + gradle.ext { + opencv_maven_path = '/' + } +} + +if (gradle.opencv_source == 'sdk_path') { + def opencvsdk='../' + //def opencvsdk='/' + //println opencvsdk + include ':opencv' + project(':opencv').projectDir = new File(opencvsdk + '/sdk') +} ") ocv_check_environment_variables(OPENCV_GRADLE_VERBOSE_OPTIONS) diff --git a/platforms/android/build-tests/test_gradle.sh b/platforms/android/build-tests/test_gradle.sh index 9f1b233ff2..bb6bc91a8e 100755 --- a/platforms/android/build-tests/test_gradle.sh +++ b/platforms/android/build-tests/test_gradle.sh @@ -29,6 +29,9 @@ rm -rf "test-gradle" cp -rp "${SDK_DIR}" "test-gradle" echo "Cloning OpenCV Android SDK ... Done!" +echo "Force Current CMake for Gradle project" +# drop cmake bin name and "bin" folder from path +echo "cmake.dir=$(dirname $(dirname $(which cmake)))" > "test-gradle/samples/local.properties" echo "Run gradle ..." (cd "test-gradle/samples"; ./gradlew -i assemble) diff --git a/samples/android/15-puzzle/build.gradle.in b/samples/android/15-puzzle/build.gradle.in index ad5c9f93f9..b1808d3892 100644 --- a/samples/android/15-puzzle/build.gradle.in +++ b/samples/android/15-puzzle/build.gradle.in @@ -1,6 +1,7 @@ apply plugin: 'com.android.application' android { + namespace 'org.opencv.samples.puzzle15' compileSdkVersion @ANDROID_COMPILE_SDK_VERSION@ defaultConfig { applicationId "org.opencv.samples.puzzle15" @@ -27,5 +28,9 @@ android { dependencies { //implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation project(':opencv') + if (gradle.opencv_source == "sdk_path") { + implementation project(':opencv') + } else if (gradle.opencv_source == "maven_local" || gradle.opencv_source == "maven_cenral") { + implementation 'org.opencv:opencv:@OPENCV_VERSION_PLAIN@' + } } diff --git a/samples/android/build.gradle.in b/samples/android/build.gradle.in index f36fe216f5..d159899132 100644 --- a/samples/android/build.gradle.in +++ b/samples/android/build.gradle.in @@ -19,6 +19,11 @@ allprojects { repositories { google() jcenter() + if (gradle.opencv_source == "maven_local") { + maven { + url gradle.opencv_maven_path + } + } } } diff --git a/samples/android/camera-calibration/build.gradle.in b/samples/android/camera-calibration/build.gradle.in index d62b151867..69c5b5bbee 100644 --- a/samples/android/camera-calibration/build.gradle.in +++ b/samples/android/camera-calibration/build.gradle.in @@ -1,6 +1,7 @@ apply plugin: 'com.android.application' android { + namespace 'org.opencv.samples.cameracalibration' compileSdkVersion @ANDROID_COMPILE_SDK_VERSION@ defaultConfig { applicationId "org.opencv.samples.cameracalibration" @@ -27,5 +28,9 @@ android { dependencies { //implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation project(':opencv') + if (gradle.opencv_source == "sdk_path") { + implementation project(':opencv') + } else if (gradle.opencv_source == "maven_local" || gradle.opencv_source == "maven_cenral") { + implementation 'org.opencv:opencv:@OPENCV_VERSION_PLAIN@' + } } diff --git a/samples/android/camera-calibration/src/org/opencv/samples/cameracalibration/CameraCalibrationActivity.java b/samples/android/camera-calibration/src/org/opencv/samples/cameracalibration/CameraCalibrationActivity.java index 30a6ad9c1d..43132ab93b 100644 --- a/samples/android/camera-calibration/src/org/opencv/samples/cameracalibration/CameraCalibrationActivity.java +++ b/samples/android/camera-calibration/src/org/opencv/samples/cameracalibration/CameraCalibrationActivity.java @@ -136,23 +136,22 @@ public class CameraCalibrationActivity extends CameraActivity implements CvCamer @Override public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.calibration: + if (item.getItemId() == R.id.calibration) { mOnCameraFrameRender = new OnCameraFrameRender(new CalibrationFrameRender(mCalibrator)); item.setChecked(true); return true; - case R.id.undistortion: + } else if (item.getItemId() == R.id.undistortion) { mOnCameraFrameRender = new OnCameraFrameRender(new UndistortionFrameRender(mCalibrator)); item.setChecked(true); return true; - case R.id.comparison: + } else if (item.getItemId() == R.id.comparison) { mOnCameraFrameRender = new OnCameraFrameRender(new ComparisonFrameRender(mCalibrator, mWidth, mHeight, getResources())); item.setChecked(true); return true; - case R.id.calibrate: + } else if (item.getItemId() == R.id.calibrate) { final Resources res = getResources(); if (mCalibrator.getCornersBufferSize() < 2) { (Toast.makeText(this, res.getString(R.string.more_samples), Toast.LENGTH_SHORT)).show(); @@ -196,7 +195,7 @@ public class CameraCalibrationActivity extends CameraActivity implements CvCamer } }.execute(); return true; - default: + } else { return super.onOptionsItemSelected(item); } } diff --git a/samples/android/color-blob-detection/build.gradle.in b/samples/android/color-blob-detection/build.gradle.in index 8900e25c16..82cbfe79f6 100644 --- a/samples/android/color-blob-detection/build.gradle.in +++ b/samples/android/color-blob-detection/build.gradle.in @@ -1,6 +1,7 @@ apply plugin: 'com.android.application' android { + namespace 'org.opencv.samples.colorblobdetect' compileSdkVersion @ANDROID_COMPILE_SDK_VERSION@ defaultConfig { applicationId "org.opencv.samples.colorblobdetect" @@ -27,5 +28,9 @@ android { dependencies { //implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation project(':opencv') + if (gradle.opencv_source == "sdk_path") { + implementation project(':opencv') + } else if (gradle.opencv_source == "maven_local" || gradle.opencv_source == "maven_cenral") { + implementation 'org.opencv:opencv:@OPENCV_VERSION_PLAIN@' + } } diff --git a/samples/android/face-detection/build.gradle.in b/samples/android/face-detection/build.gradle.in index 9e3b187a84..87fdbbf533 100644 --- a/samples/android/face-detection/build.gradle.in +++ b/samples/android/face-detection/build.gradle.in @@ -1,6 +1,7 @@ apply plugin: 'com.android.application' android { + namespace 'org.opencv.samples.facedetect' compileSdkVersion @ANDROID_COMPILE_SDK_VERSION@ defaultConfig { applicationId "org.opencv.samples.facedetect" @@ -11,7 +12,14 @@ android { externalNativeBuild { cmake { - arguments "-DOpenCV_DIR=" + project(':opencv').projectDir + "/@ANDROID_PROJECT_JNI_PATH@"@OPENCV_ANDROID_CMAKE_EXTRA_ARGS@ + if (gradle.opencv_source == "sdk_path") { + arguments "-DOpenCV_DIR=" + project(':opencv').projectDir + "/@ANDROID_PROJECT_JNI_PATH@", + "-DOPENCV_FROM_SDK=TRUE"@OPENCV_ANDROID_CMAKE_EXTRA_ARGS@ + + } else { + arguments "-DOPENCV_VERSION_MAJOR=@OPENCV_VERSION_MAJOR@", + "-DOPENCV_FROM_SDK=FALSE"@OPENCV_ANDROID_CMAKE_EXTRA_ARGS@ + } targets "detection_based_tracker" } } @@ -35,9 +43,18 @@ android { path '@ANDROID_SAMPLE_JNI_PATH@/CMakeLists.txt' } } + buildFeatures { + if (gradle.opencv_source == "maven_local" || gradle.opencv_source == "maven_cenral") { + prefab true + } + } } dependencies { //implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation project(':opencv') + if (gradle.opencv_source == "sdk_path") { + implementation project(':opencv') + } else if (gradle.opencv_source == "maven_local" || gradle.opencv_source == "maven_cenral") { + implementation 'org.opencv:opencv:@OPENCV_VERSION_PLAIN@' + } } diff --git a/samples/android/face-detection/jni/CMakeLists.txt b/samples/android/face-detection/jni/CMakeLists.txt index 15f8f4db38..4c18a0bca3 100644 --- a/samples/android/face-detection/jni/CMakeLists.txt +++ b/samples/android/face-detection/jni/CMakeLists.txt @@ -3,7 +3,12 @@ cmake_minimum_required(VERSION 3.6) set(target detection_based_tracker) project(${target} CXX) -set(ANDROID_OPENCV_COMPONENTS "opencv_java" CACHE STRING "") +if (OPENCV_FROM_SDK) + set(ANDROID_OPENCV_COMPONENTS "opencv_java" CACHE STRING "") +else() + set(ANDROID_OPENCV_COMPONENTS "OpenCV::opencv_java${OPENCV_VERSION_MAJOR}" CACHE STRING "") +endif() + message(STATUS "ANDROID_ABI=${ANDROID_ABI}") find_package(OpenCV REQUIRED COMPONENTS ${ANDROID_OPENCV_COMPONENTS}) @@ -12,4 +17,5 @@ file(GLOB hdrs *.hpp *.h) include_directories("${CMAKE_CURRENT_LIST_DIR}") add_library(${target} SHARED ${srcs} ${hdrs}) -target_link_libraries(${target} ${ANDROID_OPENCV_COMPONENTS}) +find_library(log_lib log) +target_link_libraries(${target} ${ANDROID_OPENCV_COMPONENTS} ${log_lib}) diff --git a/samples/android/image-manipulations/build.gradle.in b/samples/android/image-manipulations/build.gradle.in index 0d685ed410..d36d270a19 100644 --- a/samples/android/image-manipulations/build.gradle.in +++ b/samples/android/image-manipulations/build.gradle.in @@ -1,6 +1,7 @@ apply plugin: 'com.android.application' android { + namespace 'org.opencv.samples.imagemanipulations' compileSdkVersion @ANDROID_COMPILE_SDK_VERSION@ defaultConfig { applicationId "org.opencv.samples.imagemanipulations" @@ -27,5 +28,9 @@ android { dependencies { //implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation project(':opencv') + if (gradle.opencv_source == "sdk_path") { + implementation project(':opencv') + } else if (gradle.opencv_source == "maven_local" || gradle.opencv_source == "maven_cenral") { + implementation 'org.opencv:opencv:@OPENCV_VERSION_PLAIN@' + } } diff --git a/samples/android/mobilenet-objdetect/build.gradle.in b/samples/android/mobilenet-objdetect/build.gradle.in index e8238f7324..e1ac8b503e 100644 --- a/samples/android/mobilenet-objdetect/build.gradle.in +++ b/samples/android/mobilenet-objdetect/build.gradle.in @@ -1,6 +1,7 @@ apply plugin: 'com.android.application' android { + namespace 'org.opencv.samples.opencv_mobilenet' compileSdkVersion @ANDROID_COMPILE_SDK_VERSION@ defaultConfig { applicationId "org.opencv.samples.opencv_mobilenet" @@ -27,5 +28,9 @@ android { dependencies { //implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation project(':opencv') + if (gradle.opencv_source == "sdk_path") { + implementation project(':opencv') + } else if (gradle.opencv_source == "maven_local" || gradle.opencv_source == "maven_cenral") { + implementation 'org.opencv:opencv:@OPENCV_VERSION_PLAIN@' + } } diff --git a/samples/android/tutorial-1-camerapreview/build.gradle.in b/samples/android/tutorial-1-camerapreview/build.gradle.in index 5a649175dc..9de83844ab 100644 --- a/samples/android/tutorial-1-camerapreview/build.gradle.in +++ b/samples/android/tutorial-1-camerapreview/build.gradle.in @@ -1,6 +1,7 @@ apply plugin: 'com.android.application' android { + namespace 'org.opencv.samples.tutorial1' compileSdkVersion @ANDROID_COMPILE_SDK_VERSION@ defaultConfig { applicationId "org.opencv.samples.tutorial1" @@ -27,5 +28,9 @@ android { dependencies { //implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation project(':opencv') + if (gradle.opencv_source == "sdk_path") { + implementation project(':opencv') + } else if (gradle.opencv_source == "maven_local" || gradle.opencv_source == "maven_cenral") { + implementation 'org.opencv:opencv:@OPENCV_VERSION_PLAIN@' + } } diff --git a/samples/android/tutorial-2-mixedprocessing/build.gradle.in b/samples/android/tutorial-2-mixedprocessing/build.gradle.in index 7eca49b1b1..601f946797 100644 --- a/samples/android/tutorial-2-mixedprocessing/build.gradle.in +++ b/samples/android/tutorial-2-mixedprocessing/build.gradle.in @@ -1,6 +1,7 @@ apply plugin: 'com.android.application' android { + namespace 'org.opencv.samples.tutorial2' compileSdkVersion @ANDROID_COMPILE_SDK_VERSION@ defaultConfig { applicationId "org.opencv.samples.tutorial2" @@ -11,7 +12,14 @@ android { externalNativeBuild { cmake { - arguments "-DOpenCV_DIR=" + project(':opencv').projectDir + "/@ANDROID_PROJECT_JNI_PATH@"@OPENCV_ANDROID_CMAKE_EXTRA_ARGS@ + if (gradle.opencv_source == "sdk_path") { + arguments "-DOpenCV_DIR=" + project(':opencv').projectDir + "/@ANDROID_PROJECT_JNI_PATH@", + "-DOPENCV_FROM_SDK=TRUE"@OPENCV_ANDROID_CMAKE_EXTRA_ARGS@ + + } else { + arguments "-DOPENCV_VERSION_MAJOR=@OPENCV_VERSION_MAJOR@", + "-DOPENCV_FROM_SDK=FALSE"@OPENCV_ANDROID_CMAKE_EXTRA_ARGS@ + } targets "mixed_sample" } } @@ -35,9 +43,18 @@ android { path '@ANDROID_SAMPLE_JNI_PATH@/CMakeLists.txt' } } + buildFeatures { + if (gradle.opencv_source == "maven_local" || gradle.opencv_source == "maven_cenral") { + prefab true + } + } } dependencies { //implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation project(':opencv') + if (gradle.opencv_source == "sdk_path") { + implementation project(':opencv') + } else if (gradle.opencv_source == "maven_local" || gradle.opencv_source == "maven_cenral") { + implementation 'org.opencv:opencv:@OPENCV_VERSION_PLAIN@' + } } diff --git a/samples/android/tutorial-2-mixedprocessing/jni/CMakeLists.txt b/samples/android/tutorial-2-mixedprocessing/jni/CMakeLists.txt index 5b34f8b948..ff2a8a48f7 100644 --- a/samples/android/tutorial-2-mixedprocessing/jni/CMakeLists.txt +++ b/samples/android/tutorial-2-mixedprocessing/jni/CMakeLists.txt @@ -3,7 +3,12 @@ cmake_minimum_required(VERSION 3.6) set(target mixed_sample) project(${target} CXX) -set(ANDROID_OPENCV_COMPONENTS "opencv_java" CACHE STRING "") +if (OPENCV_FROM_SDK) + set(ANDROID_OPENCV_COMPONENTS "opencv_java" CACHE STRING "") +else() + set(ANDROID_OPENCV_COMPONENTS "OpenCV::opencv_java${OPENCV_VERSION_MAJOR}" CACHE STRING "") +endif() + message(STATUS "ANDROID_ABI=${ANDROID_ABI}") find_package(OpenCV REQUIRED COMPONENTS ${ANDROID_OPENCV_COMPONENTS}) diff --git a/samples/android/tutorial-3-cameracontrol/build.gradle.in b/samples/android/tutorial-3-cameracontrol/build.gradle.in index 0ba304f5e5..a577cb6984 100644 --- a/samples/android/tutorial-3-cameracontrol/build.gradle.in +++ b/samples/android/tutorial-3-cameracontrol/build.gradle.in @@ -1,6 +1,7 @@ apply plugin: 'com.android.application' android { + namespace 'org.opencv.samples.tutorial3' compileSdkVersion @ANDROID_COMPILE_SDK_VERSION@ defaultConfig { applicationId "org.opencv.samples.tutorial3" @@ -27,5 +28,9 @@ android { dependencies { //implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation project(':opencv') + if (gradle.opencv_source == "sdk_path") { + implementation project(':opencv') + } else if (gradle.opencv_source == "maven_local" || gradle.opencv_source == "maven_cenral") { + implementation 'org.opencv:opencv:@OPENCV_VERSION_PLAIN@' + } } diff --git a/samples/android/tutorial-4-opencl/build.gradle.in b/samples/android/tutorial-4-opencl/build.gradle.in index 2cb9a7bcb9..17a5d37190 100644 --- a/samples/android/tutorial-4-opencl/build.gradle.in +++ b/samples/android/tutorial-4-opencl/build.gradle.in @@ -1,6 +1,7 @@ apply plugin: 'com.android.application' android { + namespace 'org.opencv.samples.tutorial4' compileSdkVersion @ANDROID_COMPILE_SDK_VERSION@ defaultConfig { applicationId "org.opencv.samples.tutorial4" @@ -11,7 +12,14 @@ android { externalNativeBuild { cmake { - arguments "-DOpenCV_DIR=" + project(':opencv').projectDir + "/@ANDROID_PROJECT_JNI_PATH@"@OPENCV_ANDROID_CMAKE_EXTRA_ARGS@ + if (gradle.opencv_source == "sdk_path") { + arguments "-DOpenCV_DIR=" + project(':opencv').projectDir + "/@ANDROID_PROJECT_JNI_PATH@", + "-DOPENCV_FROM_SDK=TRUE"@OPENCV_ANDROID_CMAKE_EXTRA_ARGS@ + + } else { + arguments "-DOPENCV_VERSION_MAJOR=@OPENCV_VERSION_MAJOR@", + "-DOPENCV_FROM_SDK=FALSE"@OPENCV_ANDROID_CMAKE_EXTRA_ARGS@ + } targets "JNIpart" } } @@ -35,9 +43,18 @@ android { path '@ANDROID_SAMPLE_JNI_PATH@/CMakeLists.txt' } } + buildFeatures { + if (gradle.opencv_source == "maven_local" || gradle.opencv_source == "maven_cenral") { + prefab true + } + } } dependencies { //implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation project(':opencv') + if (gradle.opencv_source == "sdk_path") { + implementation project(':opencv') + } else if (gradle.opencv_source == "maven_local" || gradle.opencv_source == "maven_cenral") { + implementation 'org.opencv:opencv:@OPENCV_VERSION_PLAIN@' + } } diff --git a/samples/android/tutorial-4-opencl/jni/CMakeLists.txt b/samples/android/tutorial-4-opencl/jni/CMakeLists.txt index 4fdea1356e..923ccd318e 100644 --- a/samples/android/tutorial-4-opencl/jni/CMakeLists.txt +++ b/samples/android/tutorial-4-opencl/jni/CMakeLists.txt @@ -1,9 +1,14 @@ cmake_minimum_required(VERSION 3.6) -set(target mixed_sample) +set(target JNIpart) project(${target} CXX) -set(ANDROID_OPENCV_COMPONENTS "opencv_java" CACHE STRING "") +if (OPENCV_FROM_SDK) + set(ANDROID_OPENCV_COMPONENTS "opencv_java" CACHE STRING "") +else() + set(ANDROID_OPENCV_COMPONENTS "OpenCV::opencv_java${OPENCV_VERSION_MAJOR}" CACHE STRING "") +endif() + message(STATUS "ANDROID_ABI=${ANDROID_ABI}") find_package(OpenCV REQUIRED COMPONENTS ${ANDROID_OPENCV_COMPONENTS})