CMakeLists.txt 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. project(${the_module}_android)
  2. if(ANDROID_EXECUTABLE)
  3. set(OPENCV_JAVA_DIR "${OpenCV_BINARY_DIR}/android_sdk" CACHE INTERNAL "")
  4. else() # gradle
  5. set(OPENCV_JAVA_DIR "${ANDROID_BUILD_BASE_DIR}/opencv" CACHE INTERNAL "")
  6. endif()
  7. set(OPENCV_ANDROID_LIB_DIR "${OPENCV_JAVA_DIR}" CACHE INTERNAL "") # for OpenCV samples
  8. file(REMOVE_RECURSE "${OPENCV_JAVA_DIR}")
  9. file(MAKE_DIRECTORY "${OPENCV_JAVA_DIR}/bin")
  10. set(java_src_dir "${OPENCV_JAVA_DIR}/src")
  11. file(MAKE_DIRECTORY "${java_src_dir}")
  12. ocv_copyfiles_append_dir(JAVA_SRC_COPY "${OPENCV_JAVA_BINDINGS_DIR}/gen/java" "${java_src_dir}")
  13. if(ANDROID_EXECUTABLE)
  14. ocv_assert(ANDROID_TOOLS_Pkg_Revision GREATER 13)
  15. ocv_copyfiles_append_dir(JAVA_SRC_COPY "${OPENCV_JAVA_BINDINGS_DIR}/gen/android/java" "${java_src_dir}")
  16. # calc default SDK Target
  17. android_get_compatible_target(ANDROID_SDK_COMPATIBLE_TARGET ${ANDROID_NATIVE_API_LEVEL} ${ANDROID_SDK_TARGET} 14)
  18. if(ANDROID_SDK_COMPATIBLE_TARGET)
  19. set(ANDROID_SDK_COMPATIBLE_TARGET "${ANDROID_SDK_COMPATIBLE_TARGET}" CACHE INTERNAL "")
  20. endif()
  21. string(REGEX REPLACE "android-" "" android_sdk_target_num ${ANDROID_SDK_COMPATIBLE_TARGET})
  22. if( (ANDROID_SDK_TARGET AND ANDROID_SDK_TARGET LESS 21) OR (android_sdk_target_num LESS 21) )
  23. message(STATUS "[OpenCV for Android SDK]: A new OpenGL Camera Bridge (CameraGLSurfaceView, CameraGLRendererBase, CameraRenderer, Camera2Renderer) is disabled, because ANDROID_SDK_TARGET (${android_sdk_target_num}) < 21")
  24. else()
  25. ocv_copyfiles_append_dir(JAVA_SRC_COPY "${OPENCV_JAVA_BINDINGS_DIR}/gen/android-21/java" "${java_src_dir}")
  26. endif()
  27. # copy boilerplate
  28. file(GLOB_RECURSE seed_project_files_rel RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/android_lib/" "${CMAKE_CURRENT_SOURCE_DIR}/android_lib/*")
  29. list(REMOVE_ITEM seed_project_files_rel "${ANDROID_MANIFEST_FILE}")
  30. foreach(file ${seed_project_files_rel})
  31. configure_file("${CMAKE_CURRENT_SOURCE_DIR}/android_lib/${file}" "${OPENCV_JAVA_DIR}/${file}" @ONLY)
  32. list(APPEND depends "${CMAKE_CURRENT_SOURCE_DIR}/android_lib/${file}")
  33. get_filename_component(install_subdir "${file}" PATH)
  34. install(FILES "${OPENCV_JAVA_DIR}/${file}" DESTINATION "${JAVA_INSTALL_ROOT}/${install_subdir}" COMPONENT java)
  35. endforeach()
  36. list(APPEND depends gen_opencv_java_source "${OPENCV_DEPHELPER}/gen_opencv_java_source")
  37. ocv_copyfiles_add_target(${the_module}_android_source_copy JAVA_SRC_COPY "Copy Java(Android SDK) source files" ${depends})
  38. file(REMOVE "${OPENCV_DEPHELPER}/${the_module}_android_source_copy") # force rebuild after CMake run
  39. set(depends ${the_module}_android_source_copy "${OPENCV_DEPHELPER}/${the_module}_android_source_copy")
  40. # generate Android library project
  41. set(android_sdk_project_files ${ANDROID_LIB_PROJECT_FILES}) # build.xml;local.properties;proguard-project.txt;project.properties
  42. ocv_list_add_prefix(android_sdk_project_files "${OPENCV_JAVA_DIR}/")
  43. configure_file("${CMAKE_CURRENT_SOURCE_DIR}/android_lib/${ANDROID_MANIFEST_FILE}" "${CMAKE_CURRENT_BINARY_DIR}/${ANDROID_MANIFEST_FILE}" @ONLY)
  44. add_custom_command(
  45. OUTPUT ${android_sdk_project_files} "${OPENCV_JAVA_DIR}/${ANDROID_MANIFEST_FILE}"
  46. COMMAND ${CMAKE_COMMAND} -E remove ${android_sdk_project_files}
  47. COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_BINARY_DIR}/${ANDROID_MANIFEST_FILE}" "${OPENCV_JAVA_DIR}/${ANDROID_MANIFEST_FILE}"
  48. COMMAND ${ANDROID_EXECUTABLE} --silent create lib-project --path \"${OPENCV_JAVA_DIR}\" --target \"${ANDROID_SDK_COMPATIBLE_TARGET}\" --name OpenCV --package org.opencv 2>\"${CMAKE_CURRENT_BINARY_DIR}/create_lib_project.log\"
  49. COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_BINARY_DIR}/${ANDROID_MANIFEST_FILE}" "${OPENCV_JAVA_DIR}/${ANDROID_MANIFEST_FILE}"
  50. WORKING_DIRECTORY "${OPENCV_JAVA_DIR}"
  51. MAIN_DEPENDENCY "${CMAKE_CURRENT_BINARY_DIR}/${ANDROID_MANIFEST_FILE}"
  52. DEPENDS ${depends}
  53. COMMENT "Generating OpenCV Android library project. SDK target: ${lib_target_sdk_target}"
  54. )
  55. list(APPEND depends ${android_sdk_project_files} "${OPENCV_JAVA_DIR}/${ANDROID_MANIFEST_FILE}")
  56. install(DIRECTORY "${OPENCV_JAVA_DIR}/src" DESTINATION "${JAVA_INSTALL_ROOT}" COMPONENT java)
  57. install(FILES "${OPENCV_JAVA_DIR}/${ANDROID_PROJECT_PROPERTIES_FILE}" DESTINATION ${JAVA_INSTALL_ROOT} COMPONENT java)
  58. install(FILES "${OPENCV_JAVA_DIR}/${ANDROID_MANIFEST_FILE}" DESTINATION ${JAVA_INSTALL_ROOT} COMPONENT java)
  59. # build jar
  60. set(JAR_FILE "${OpenCV_BINARY_DIR}/bin/classes.jar")
  61. # build the library project
  62. # normally we should do this after a native part, but for a library project we can build the java part first
  63. add_custom_command(
  64. OUTPUT "${JAR_FILE}" "${OPENCV_DEPHELPER}/${the_module}_android"
  65. COMMAND ${ANT_EXECUTABLE} -q -noinput -k debug -Djava.target=1.6 -Djava.source=1.6
  66. COMMAND ${CMAKE_COMMAND} -E touch "${OPENCV_DEPHELPER}/${the_module}_android"
  67. WORKING_DIRECTORY "${OPENCV_JAVA_DIR}"
  68. DEPENDS ${depends}
  69. COMMENT "Building OpenCV Android library project"
  70. )
  71. add_custom_target(${the_module}_android DEPENDS "${OPENCV_DEPHELPER}/${the_module}_android" SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/android_lib/${ANDROID_MANIFEST_FILE}")
  72. add_dependencies(${the_module} ${the_module}_android)
  73. # empty 'gen' and 'res' folders
  74. install(CODE "
  75. FILE(MAKE_DIRECTORY \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${JAVA_INSTALL_ROOT}/gen\")
  76. FILE(MAKE_DIRECTORY \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${JAVA_INSTALL_ROOT}/res\")
  77. " COMPONENT java)
  78. ocv_update(ANDROID_COMPILE_SDK_VERSION "27")
  79. ocv_update(ANDROID_MIN_SDK_VERSION "14")
  80. if(ANDROID_NATIVE_API_LEVEL GREATER 21)
  81. ocv_update(ANDROID_TARGET_SDK_VERSION "${ANDROID_NATIVE_API_LEVEL}")
  82. else()
  83. ocv_update(ANDROID_TARGET_SDK_VERSION "21")
  84. endif()
  85. configure_file("${CMAKE_CURRENT_SOURCE_DIR}/build.gradle.in" "${CMAKE_CURRENT_BINARY_DIR}/build.gradle" @ONLY)
  86. install(FILES "${CMAKE_CURRENT_BINARY_DIR}/build.gradle" DESTINATION ${JAVA_INSTALL_ROOT}/.. COMPONENT java)
  87. else() # gradle build
  88. #
  89. # Android Gradle-based project
  90. #
  91. #TODO: INSTALL ONLY
  92. ocv_copyfiles_append_dir(JAVA_SRC_COPY "${OPENCV_JAVA_BINDINGS_DIR}/gen/android/java" "${java_src_dir}")
  93. ocv_copyfiles_append_dir(JAVA_SRC_COPY "${OPENCV_JAVA_BINDINGS_DIR}/gen/android-21/java" "${java_src_dir}")
  94. # copy boilerplate
  95. set(__base_dir "${CMAKE_CURRENT_SOURCE_DIR}/android_gradle_lib/")
  96. file(GLOB_RECURSE seed_project_files_rel RELATIVE "${__base_dir}/" "${__base_dir}/*")
  97. list(REMOVE_ITEM seed_project_files_rel "${ANDROID_MANIFEST_FILE}")
  98. foreach(file ${seed_project_files_rel})
  99. configure_file("${__base_dir}/${file}" "${OPENCV_JAVA_DIR}/${file}" @ONLY)
  100. list(APPEND depends "${__base_dir}/${file}")
  101. get_filename_component(install_subdir "${file}" PATH)
  102. if(NOT file STREQUAL "build.gradle")
  103. install(FILES "${OPENCV_JAVA_DIR}/${file}" DESTINATION "${JAVA_INSTALL_ROOT}/${install_subdir}" COMPONENT java)
  104. endif()
  105. endforeach()
  106. # copy libcxx_helper
  107. set(__base_dir "${CMAKE_CURRENT_SOURCE_DIR}/")
  108. file(GLOB_RECURSE __files_rel RELATIVE "${__base_dir}/" "${__base_dir}/libcxx_helper/*")
  109. foreach(file ${__files_rel})
  110. configure_file("${__base_dir}/${file}" "${OPENCV_JAVA_DIR}/${file}" @ONLY)
  111. list(APPEND depends "${__base_dir}/${file}")
  112. get_filename_component(install_subdir "${file}" PATH)
  113. install(FILES "${OPENCV_JAVA_DIR}/${file}" DESTINATION "${JAVA_INSTALL_ROOT}/../${install_subdir}" COMPONENT java)
  114. endforeach()
  115. list(APPEND depends gen_opencv_java_source "${OPENCV_DEPHELPER}/gen_opencv_java_source")
  116. ocv_copyfiles_add_target(${the_module}_android_source_copy JAVA_SRC_COPY "Copy Java(Android SDK) source files" ${depends})
  117. file(REMOVE "${OPENCV_DEPHELPER}/${the_module}_android_source_copy") # force rebuild after CMake run
  118. set(depends ${the_module}_android_source_copy "${OPENCV_DEPHELPER}/${the_module}_android_source_copy")
  119. # build jar
  120. set(AAR_FILE "${OPENCV_JAVA_DIR}/build/outputs/aar/opencv-release.aar")
  121. ocv_update(OPENCV_GRADLE_VERBOSE_OPTIONS "-i")
  122. add_custom_command(
  123. OUTPUT "${AAR_FILE}" "${OPENCV_DEPHELPER}/${the_module}_android"
  124. COMMAND ./gradlew ${OPENCV_GRADLE_VERBOSE_OPTIONS} "opencv:assemble"
  125. COMMAND ${CMAKE_COMMAND} -E touch "${OPENCV_DEPHELPER}/${the_module}_android"
  126. WORKING_DIRECTORY "${ANDROID_BUILD_BASE_DIR}"
  127. DEPENDS ${depends} ${the_module}
  128. COMMENT "Building OpenCV Android library project"
  129. )
  130. file(REMOVE "${OPENCV_DEPHELPER}/${the_module}_android") # force rebuild after CMake run
  131. add_custom_target(${the_module}_android ALL DEPENDS "${OPENCV_DEPHELPER}/${the_module}_android" SOURCES "${__base_dir}/${ANDROID_MANIFEST_FILE}")
  132. configure_file("${CMAKE_CURRENT_SOURCE_DIR}/build.gradle.in" "${ANDROID_TMP_INSTALL_BASE_DIR}/opencv/build.gradle" @ONLY)
  133. install(FILES "${ANDROID_TMP_INSTALL_BASE_DIR}/opencv/build.gradle" DESTINATION ${JAVA_INSTALL_ROOT}/.. COMPONENT java)
  134. install(DIRECTORY "${java_src_dir}" DESTINATION "${JAVA_INSTALL_ROOT}" COMPONENT java)
  135. endif() # gradle build