From 092699783ad3e0fd5b1edff9af22e8816567a331 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev <no@email> Date: Thu, 30 Jun 2011 13:37:56 +0000 Subject: [PATCH] Added cmake script to build Android samples --- CMakeLists.txt | 5 +- android/scripts/cmake_android.sh | 2 +- modules/java/CMakeLists.txt | 7 ++ samples/CMakeLists.txt | 9 +- samples/android/0-base/default.properties | 11 +-- samples/android/1-java/default.properties | 11 +-- samples/android/2-native/default.properties | 9 -- samples/android/4-mixed/default.properties | 11 +-- samples/android/CMakeLists.txt | 97 +++++++++++++++++++++ 9 files changed, 119 insertions(+), 43 deletions(-) create mode 100644 samples/android/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index f0289611b3..8b6de8c566 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -697,11 +697,12 @@ if (BUILD_JAVA_SUPPORT AND (BUILD_EXAMPLES OR BUILD_TESTS)) OUTPUT_VARIABLE ANT_VERSION_FULL OUTPUT_STRIP_TRAILING_WHITESPACE) string(REGEX MATCH "[0-9]+.[0-9]+.[0-9]+" ANT_VERSION "${ANT_VERSION_FULL}") - + message(STATUS " Found apache ant ${ANT_VERSION}: ${ANT_EXECUTABLE}") endif() - if (ANDROID_EXECUTABLE AND ANT_EXECUTABLE AND ANT_VERSION VERSION_GREATER 1.8) + + if (ANDROID_EXECUTABLE AND ANT_EXECUTABLE AND (ANT_VERSION VERSION_GREATER 1.7.-1)) SET(CAN_BUILD_ANDROID_PROJECTS TRUE) else() SET(CAN_BUILD_ANDROID_PROJECTS FALSE) diff --git a/android/scripts/cmake_android.sh b/android/scripts/cmake_android.sh index e95d35f9b3..c17110e69b 100644 --- a/android/scripts/cmake_android.sh +++ b/android/scripts/cmake_android.sh @@ -4,5 +4,5 @@ cd `dirname $0`/.. mkdir -p build cd build -cmake -C ../CMakeCache.android.initial.cmake -DCMAKE_TOOLCHAIN_FILE=../android.toolchain.cmake ../.. +cmake -C ../CMakeCache.android.initial.cmake -DCMAKE_TOOLCHAIN_FILE=../android.toolchain.cmake $@ ../.. diff --git a/modules/java/CMakeLists.txt b/modules/java/CMakeLists.txt index 662c11de09..43783f274a 100644 --- a/modules/java/CMakeLists.txt +++ b/modules/java/CMakeLists.txt @@ -12,6 +12,8 @@ ENDIF() SET(GEN_JAVA "${CMAKE_CURRENT_SOURCE_DIR}/gen_java.py") SET(HDR_PARSER "${CMAKE_CURRENT_SOURCE_DIR}/../python/src2/hdr_parser.py") +SET(additional_clean_files "") + foreach(module ${OPENCV_JAVA_MODULES}) IF(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/config/${module}.filelist") FILE(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/config/${module}.filelist" headers_to_parse) @@ -100,6 +102,7 @@ IF(ANDROID) COMMENT "Generating ${lib_file_name}" ) install(FILES "${CMAKE_BINARY_DIR}/${lib_file_name}" DESTINATION . COMPONENT main) + LIST(APPEND additional_clean_files "${CMAKE_BINARY_DIR}/${lib_file_name}") endif() endforeach() @@ -111,6 +114,7 @@ IF(ANDROID) DEPENDS "${jni_file}" COMMENT "Generating jni/${jni_file_name}" ) + LIST(APPEND additional_clean_files "${CMAKE_BINARY_DIR}/jni/${jni_file_name}") endforeach() ENDIF() @@ -126,8 +130,11 @@ foreach(java_file ${java_project_files} ${generated_java_sources}) DEPENDS "${JAVA_OUTPUT_DIR}" COMMENT "Generating src/org/opencv/${java_file_name}" ) + LIST(APPEND additional_clean_files "${JAVA_OUTPUT_DIR}/${java_file_name}") if(ANDROID) install(FILES "${JAVA_OUTPUT_DIR}/${java_file_name}" DESTINATION src/org/opencv COMPONENT main) endif() endforeach() +set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${additional_clean_files}") + diff --git a/samples/CMakeLists.txt b/samples/CMakeLists.txt index 1a601589a9..7a7fe682d1 100644 --- a/samples/CMakeLists.txt +++ b/samples/CMakeLists.txt @@ -5,7 +5,14 @@ add_subdirectory(c) add_subdirectory(cpp) -add_subdirectory(gpu) + +if(NOT ANDROID) + add_subdirectory(gpu) +endif() + +if(ANDROID AND CAN_BUILD_ANDROID_PROJECTS) + add_subdirectory(android) +endif() if(0) add_subdirectory(swig_python) diff --git a/samples/android/0-base/default.properties b/samples/android/0-base/default.properties index 787ee33afa..32299c258a 100644 --- a/samples/android/0-base/default.properties +++ b/samples/android/0-base/default.properties @@ -1,11 +1,2 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system use, -# "build.properties", and override values to adapt the script to your -# project structure. - # Project target. -target=android-8 \ No newline at end of file +target=android-8 diff --git a/samples/android/1-java/default.properties b/samples/android/1-java/default.properties index b4a7e0f66a..fb3ea1f7b3 100644 --- a/samples/android/1-java/default.properties +++ b/samples/android/1-java/default.properties @@ -1,12 +1,3 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system use, -# "build.properties", and override values to adapt the script to your -# project structure. - +android.library.reference.1=../../../android/build # Project target. target=android-8 -android.library.reference.1=../../../android/build diff --git a/samples/android/2-native/default.properties b/samples/android/2-native/default.properties index e2e8061f26..32299c258a 100644 --- a/samples/android/2-native/default.properties +++ b/samples/android/2-native/default.properties @@ -1,11 +1,2 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system use, -# "build.properties", and override values to adapt the script to your -# project structure. - # Project target. target=android-8 diff --git a/samples/android/4-mixed/default.properties b/samples/android/4-mixed/default.properties index b4a7e0f66a..fb3ea1f7b3 100644 --- a/samples/android/4-mixed/default.properties +++ b/samples/android/4-mixed/default.properties @@ -1,12 +1,3 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system use, -# "build.properties", and override values to adapt the script to your -# project structure. - +android.library.reference.1=../../../android/build # Project target. target=android-8 -android.library.reference.1=../../../android/build diff --git a/samples/android/CMakeLists.txt b/samples/android/CMakeLists.txt new file mode 100644 index 0000000000..1bda5fbd64 --- /dev/null +++ b/samples/android/CMakeLists.txt @@ -0,0 +1,97 @@ +# ---------------------------------------------------------------------------- +# CMake file for Android samples. See root CMakeLists.txt +# +# ---------------------------------------------------------------------------- + +if (BUILD_EXAMPLES) + project(android_samples) + + include_directories( + "${CMAKE_SOURCE_DIR}/modules/core/include" + "${CMAKE_SOURCE_DIR}/modules/flann/include" + "${CMAKE_SOURCE_DIR}/modules/imgproc/include" + "${CMAKE_SOURCE_DIR}/modules/video/include" + "${CMAKE_SOURCE_DIR}/modules/highgui/include" + "${CMAKE_SOURCE_DIR}/modules/ml/include" + "${CMAKE_SOURCE_DIR}/modules/calib3d/include" + "${CMAKE_SOURCE_DIR}/modules/features2d/include" + "${CMAKE_SOURCE_DIR}/modules/objdetect/include" + "${CMAKE_SOURCE_DIR}/modules/legacy/include" + "${CMAKE_SOURCE_DIR}/modules/contrib/include" + ) + + SET (sample_dependencies opencv_contrib opencv_legacy opencv_objdetect opencv_calib3d opencv_features2d opencv_video opencv_highgui opencv_ml opencv_imgproc opencv_flann opencv_core) + if(NOT BUILD_SHARED_LIBS) + LIST(APPEND sample_dependencies opencv_androidcamera) + endif() + + SET(additional_clean_files "") + + macro(ADD_ANDROID_SAMPLE sample_name) + #message(STATUS "Build android sample: '${sample_name}'") + SET(sample_dir "${CMAKE_CURRENT_SOURCE_DIR}/${sample}") + + add_custom_target(${sample} ALL) + add_dependencies(${sample} opencv_java opencv_java_api) + + set_target_properties(${sample} PROPERTIES + PROJECT_LABEL "(ANDROID EXAMPLE) ${sample}") + + file(RELATIVE_PATH OPENCV_REFERENCE_PATH "${sample_dir}" "${CMAKE_BINARY_DIR}") + + if(NOT ("${sample}" STREQUAL "0-base" OR "${sample}" STREQUAL "2-native")) + SET(opencv_reference --library \"${OPENCV_REFERENCE_PATH}\") + else() + SET(opencv_reference) + endif() + + add_custom_command( + TARGET ${sample} + WORKING_DIRECTORY ${sample_dir} + COMMAND ${CMAKE_COMMAND} -E remove -f "${sample_dir}/default.properties" + COMMAND ${CMAKE_COMMAND} -E touch "${sample_dir}/default.properties" + COMMAND ${ANDROID_EXECUTABLE} update project --name "${sample}" --target 7 ${opencv_reference} --path . + COMMAND ${ANT_EXECUTABLE} debug + COMMAND ${CMAKE_COMMAND} -E copy "${sample_dir}/bin/${sample}-debug.apk" "${CMAKE_BINARY_DIR}/bin/${sample}-debug.apk" + ) + + LIST(APPEND additional_clean_files "${CMAKE_BINARY_DIR}/bin/${sample}-debug.apk" "${sample_dir}/build.xml" "${sample_dir}/local.properties" "${sample_dir}/proguard.cfg") + + if(IS_DIRECTORY "${sample_dir}/jni") + INCLUDE_DIRECTORIES("${sample_dir}/jni") + FILE( GLOB srcs "${sample_dir}/jni/*.cpp" ) + + FILE(STRINGS "${sample_dir}/jni/Android.mk" JNI_LIB_NAME REGEX "LOCAL_MODULE[ ]*:=[ ]*.*" ) + string(REGEX REPLACE "LOCAL_MODULE[ ]*:=[ ]*([a-zA-Z_][a-zA-Z_0-9]*)[ ]*" "\\1" JNI_LIB_NAME "${JNI_LIB_NAME}") + + ADD_LIBRARY( ${JNI_LIB_NAME} MODULE ${srcs} ) + + ADD_DEPENDENCIES(${JNI_LIB_NAME} ${sample_dependencies}) + TARGET_LINK_LIBRARIES(${JNI_LIB_NAME} ${OPENCV_LINKER_LIBS} ${sample_dependencies}) + + set_target_properties(${JNI_LIB_NAME} PROPERTIES + OUTPUT_NAME "${JNI_LIB_NAME}" + LIBRARY_OUTPUT_DIRECTORY "${sample_dir}/libs/${ARMEABI_NDK_NAME}" + ) + + ADD_CUSTOM_COMMAND( + TARGET ${JNI_LIB_NAME} + POST_BUILD + COMMAND ${CMAKE_STRIP} "${sample_dir}/libs/${ARMEABI_NDK_NAME}/*.so" + ) + + add_dependencies(${sample} ${JNI_LIB_NAME}) + endif() + endmacro() + + file(GLOB android_samples RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *) + list(SORT android_samples) + + foreach(sample ${android_samples}) + if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${sample}/AndroidManifest.xml) + ADD_ANDROID_SAMPLE(${sample}) + endif() + endforeach() + + set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${additional_clean_files}") +endif()