1 # creates target "${_target}_android_project" for building standard Android project
\r
2 macro(add_android_project _target _path)
\r
3 SET (android_dependencies opencv_contrib opencv_legacy opencv_objdetect opencv_calib3d opencv_features2d opencv_video opencv_highgui opencv_ml opencv_imgproc opencv_flann opencv_core)
\r
4 if(NOT BUILD_SHARED_LIBS)
\r
5 LIST(APPEND android_dependencies opencv_androidcamera)
\r
8 if (ANDROID AND CAN_BUILD_ANDROID_PROJECTS)
\r
9 file(GLOB_RECURSE res_files_all RELATIVE "${_path}" "${_path}/res/*")
\r
10 file(GLOB_RECURSE jni_files_all RELATIVE "${_path}" "${_path}/jni/*.c*" "${_path}/jni/*.h*")
\r
11 file(GLOB_RECURSE src_files_all RELATIVE "${_path}" "${_path}/src/*.java")
\r
15 foreach(f ${res_files_all})
\r
16 if(NOT f MATCHES "\\.svn")
\r
17 list(APPEND res_files "${f}")
\r
21 foreach(f ${jni_files_all})
\r
22 if(NOT f MATCHES "\\.svn")
\r
23 list(APPEND jni_files "${f}")
\r
27 foreach(f ${src_files_all})
\r
28 if(NOT f MATCHES "\\.svn")
\r
29 list(APPEND src_files "${f}")
\r
33 # get temporary location for the project
\r
34 file(RELATIVE_PATH build_path "${OpenCV_SOURCE_DIR}" "${_path}")
\r
35 SET(build_path "${CMAKE_BINARY_DIR}/${build_path}")
\r
37 # copy project to temporary location
\r
38 SET(${_target}_project_files)
\r
39 foreach(f ${res_files} ${src_files} "AndroidManifest.xml")
\r
40 if(NOT "${build_path}" STREQUAL "${_path}")
\r
41 #this is not needed in case of in-source build
\r
43 OUTPUT "${build_path}/${f}"
\r
44 COMMAND ${CMAKE_COMMAND} -E copy "${_path}/${f}" "${build_path}/${f}"
\r
45 DEPENDS "${_path}/${f}"
\r
49 list(APPEND ${_target}_project_files "${build_path}/${f}")
\r
52 # process default.properties
\r
53 file(STRINGS "${_path}/default.properties" default_properties REGEX "^android\\.library\\.reference\\.1=.+$")
\r
54 if (default_properties)
\r
55 # has opencv dependency
\r
56 file(RELATIVE_PATH OPENCV_REFERENCE_PATH "${build_path}" "${CMAKE_BINARY_DIR}")
\r
58 OUTPUT "${build_path}/default.properties"
\r
59 OUTPUT "${build_path}/build.xml"
\r
60 OUTPUT "${build_path}/local.properties"
\r
61 OUTPUT "${build_path}/proguard.cfg"
\r
62 COMMAND ${CMAKE_COMMAND} -E echo "" > "default.properties"
\r
63 COMMAND ${ANDROID_EXECUTABLE} update project --name "${_target}" --target "${ANDROID_SDK_TARGET}" --library "${OPENCV_REFERENCE_PATH}" --path .
\r
64 WORKING_DIRECTORY ${build_path}
\r
65 DEPENDS ${${_target}_project_files}
\r
66 DEPENDS "${CMAKE_BINARY_DIR}/default.properties"
\r
67 DEPENDS "${CMAKE_BINARY_DIR}/AndroidManifest.xml"
\r
68 COMMENT "Updating android project - ${_target}"
\r
71 # has no opencv dependency
\r
73 OUTPUT "${build_path}/default.properties"
\r
74 OUTPUT "${build_path}/build.xml"
\r
75 OUTPUT "${build_path}/local.properties"
\r
76 OUTPUT "${build_path}/proguard.cfg"
\r
77 COMMAND ${CMAKE_COMMAND} -E echo "" > "default.properties"
\r
78 COMMAND ${ANDROID_EXECUTABLE} update project --name "${_target}" --target "${ANDROID_SDK_TARGET}" --path .
\r
79 WORKING_DIRECTORY ${build_path}
\r
80 DEPENDS ${${_target}_project_files}
\r
81 COMMENT "Updating android project - ${_target}"
\r
85 if("${build_path}" STREQUAL "${_path}")
\r
86 #in case of in-source build default.properties file is not generated (it is just overwritten :)
\r
87 SET_SOURCE_FILES_PROPERTIES("${build_path}/default.properties" PROPERTIES GENERATED FALSE)
\r
90 list(APPEND ${_target}_project_files "${build_path}/default.properties" "${build_path}/build.xml" "${build_path}/local.properties" "${build_path}/proguard.cfg")
\r
92 # build native part of android project
\r
94 INCLUDE_DIRECTORIES("${_path}/jni")
\r
96 FILE(STRINGS "${_path}/jni/Android.mk" JNI_LIB_NAME REGEX "LOCAL_MODULE[ ]*:=[ ]*.*" )
\r
97 string(REGEX REPLACE "LOCAL_MODULE[ ]*:=[ ]*([a-zA-Z_][a-zA-Z_0-9]*)[ ]*" "\\1" JNI_LIB_NAME "${JNI_LIB_NAME}")
\r
100 foreach(src ${jni_files})
\r
101 list(APPEND jni_sources "${_path}/${src}")
\r
104 ADD_LIBRARY(${JNI_LIB_NAME} MODULE ${jni_sources})
\r
105 TARGET_LINK_LIBRARIES(${JNI_LIB_NAME} ${OPENCV_LINKER_LIBS} ${android_dependencies})
\r
107 set_target_properties(${JNI_LIB_NAME} PROPERTIES
\r
108 OUTPUT_NAME "${JNI_LIB_NAME}"
\r
109 LIBRARY_OUTPUT_DIRECTORY "${build_path}/libs/${ARMEABI_NDK_NAME}"
\r
112 ADD_CUSTOM_COMMAND(
\r
113 TARGET ${JNI_LIB_NAME}
\r
115 COMMAND ${CMAKE_STRIP} "${build_path}/libs/${ARMEABI_NDK_NAME}/*.so"
\r
121 add_custom_command(
\r
122 OUTPUT "${build_path}/bin/${_target}-debug.apk"
\r
123 OUTPUT "${CMAKE_BINARY_DIR}/bin/${_target}.apk"
\r
124 COMMAND ${ANT_EXECUTABLE} -q -noinput -k debug
\r
125 COMMAND ${CMAKE_COMMAND} -E copy "${build_path}/bin/${_target}-debug.apk" "${CMAKE_BINARY_DIR}/bin/${_target}.apk"
\r
126 WORKING_DIRECTORY ${build_path}
\r
127 DEPENDS ${${_target}_project_files}
\r
128 DEPENDS "${LIBRARY_OUTPUT_PATH}/libopencv_java.so"
\r
129 COMMENT "Generating bin/${_target}.apk"
\r
132 ADD_CUSTOM_TARGET(${_target}_android_project ALL
\r
133 DEPENDS "${build_path}/bin/${_target}-debug.apk"
\r
134 DEPENDS "${CMAKE_BINARY_DIR}/bin/${_target}.apk"
\r
137 add_dependencies(${_target}_android_project opencv_java ${JNI_LIB_NAME})
\r
139 if("${ARGN}" STREQUAL "INSTALL" AND INSTALL_ANDROID_EXAMPLES)
\r
140 install(FILES "${CMAKE_BINARY_DIR}/bin/${_target}.apk" DESTINATION "bin" COMPONENT main)
\r