moved GpuMat and DevMem2D to core module, some code refactoring
[profile/ivi/opencv.git] / OpenCVAndroidProject.cmake
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
6     endif()\r
7 \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
12         \r
13         #remove .svn \r
14         set(res_files)\r
15         foreach(f ${res_files_all})\r
16             if(NOT f MATCHES "\\.svn")\r
17                 list(APPEND res_files "${f}")\r
18             endif()\r
19         endforeach()\r
20         set(jni_files)\r
21         foreach(f ${jni_files_all})\r
22             if(NOT f MATCHES "\\.svn")\r
23                 list(APPEND jni_files "${f}")\r
24             endif()\r
25         endforeach()\r
26         set(src_files)\r
27         foreach(f ${src_files_all})\r
28             if(NOT f MATCHES "\\.svn")\r
29                 list(APPEND src_files "${f}")\r
30             endif()\r
31         endforeach()\r
32 \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
36         \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
42                 add_custom_command(\r
43                     OUTPUT "${build_path}/${f}"\r
44                     COMMAND ${CMAKE_COMMAND} -E copy "${_path}/${f}" "${build_path}/${f}"\r
45                     DEPENDS "${_path}/${f}"\r
46                     COMMENT ""\r
47                     )\r
48             endif()\r
49             list(APPEND ${_target}_project_files "${build_path}/${f}")\r
50         endforeach()\r
51 \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
57             add_custom_command(\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
69                 )\r
70         else()\r
71             # has no opencv dependency\r
72             add_custom_command(\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
82                 )\r
83         endif()\r
84         \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
88         endif()\r
89         \r
90         list(APPEND ${_target}_project_files "${build_path}/default.properties" "${build_path}/build.xml" "${build_path}/local.properties" "${build_path}/proguard.cfg")\r
91 \r
92         # build native part of android project\r
93         if(jni_files)\r
94             INCLUDE_DIRECTORIES("${_path}/jni")\r
95 \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
98 \r
99             SET(jni_sources)\r
100             foreach(src ${jni_files})\r
101                 list(APPEND jni_sources "${_path}/${src}")\r
102             endforeach()\r
103 \r
104             ADD_LIBRARY(${JNI_LIB_NAME} MODULE ${jni_sources})\r
105             TARGET_LINK_LIBRARIES(${JNI_LIB_NAME} ${OPENCV_LINKER_LIBS} ${android_dependencies})\r
106 \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
110             )\r
111 \r
112             ADD_CUSTOM_COMMAND(\r
113                 TARGET ${JNI_LIB_NAME}\r
114                 POST_BUILD\r
115                 COMMAND ${CMAKE_STRIP} "${build_path}/libs/${ARMEABI_NDK_NAME}/*.so"\r
116                 )\r
117         else()\r
118             SET(JNI_LIB_NAME)\r
119         endif()\r
120 \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
130         )\r
131 \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
135             )\r
136 \r
137         add_dependencies(${_target}_android_project opencv_java ${JNI_LIB_NAME})\r
138 \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
141         endif()\r
142     endif()\r
143 endmacro()\r