diff --git a/CMakeLists.txt b/CMakeLists.txt index 7c49dd24c..f5adb542a 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -306,24 +306,34 @@ if(ANDROID) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_DEBUG} -gdwarf-3") endif() set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -llog") - if (NOT FREERDP_ANDROID_EXTERNAL_SSL_PATH) - if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external/openssl") - set(FREERDP_ANDROID_EXTERNAL_SSL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/external/openssl") + + if (NOT FREERDP_EXTERNAL_JPEG_PATH) + if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external/jpeg8d") + set(FREERDP_EXTERNAL_JPEG_PATH "${CMAKE_CURRENT_SOURCE_DIR}/external/jpeg8d") else() - message(STATUS "FREERDP_ANDROID_EXTERNAL_SSL_PATH not set! - Needs to be set if openssl is not found in the android NDK (which usually isn't)") + message(STATUS "FREERDP_EXTERNAL_SSL_PATH not set! - Needs to be set if openssl is not found in the android NDK (which usually isn't)") + endif() + endif() + if (NOT FREERDP_EXTERNAL_SSL_PATH) + if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external/openssl") + set(FREERDP_EXTERNAL_SSL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/external/openssl") + else() + message(STATUS "FREERDP_EXTERNAL_SSL_PATH not set! - Needs to be set if openssl is not found in the android NDK (which usually isn't)") endif() if(WITH_GPROF) - if (NOT FREERDP_ANDROID_EXTERNAL_PROFILER_PATH) + if (NOT FREERDP_EXTERNAL_PROFILER_PATH) if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external/android-ndk-profiler") - set(FREERDP_ANDROID_EXTERNAL_PROFILER_PATH + set(FREERDP_EXTERNAL_PROFILER_PATH "${CMAKE_CURRENT_SOURCE_DIR}/external/android-ndk-profiler") else() - message(STATUS "FREERDP_ANDROID_EXTERNAL_PROFILER_PATH not set!") + message(STATUS "FREERDP_EXTERNAL_PROFILER_PATH not set!") endif() endif() endif() endif() - set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_ANDROID_EXTERNAL_SSL_PATH}) +set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_EXTERNAL_SSL_PATH} ${FREERDP_EXTERNAL_JPEG_PATH}) +set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_EXTERNAL_PROFILER_PATH}) + set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/client/Android/FreeRDPCore/jni/${ANDROID_ABI}) CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/scripts/regenerate_jni_headers.sh.cmake ${CMAKE_BINARY_DIR}/scripts/regenerate_jni_headers.sh @ONLY) @@ -527,8 +537,8 @@ if(ANDROID) if(WITH_GPROF) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg") set(PROFILER_LIBRARIES - "${FREERDP_ANDROID_EXTERNAL_PROFILER_PATH}/obj/local/${ANDROID_ABI}/libandroid-ndk-profiler.a") - include_directories("${FREERDP_ANDROID_EXTERNAL_PROFILER_PATH}") + "${FREERDP_EXTERNAL_PROFILER_PATH}/obj/local/${ANDROID_ABI}/libandroid-ndk-profiler.a") + include_directories("${FREERDP_EXTERNAL_PROFILER_PATH}") endif() endif() diff --git a/ci/cmake-preloads/config-android.txt b/ci/cmake-preloads/config-android.txt index 7e7e5048b..5f5e368bc 100644 --- a/ci/cmake-preloads/config-android.txt +++ b/ci/cmake-preloads/config-android.txt @@ -1,6 +1,6 @@ message("PRELOADING android cache") set(CMAKE_TOOLCHAIN_FILE "cmake/AndroidToolchain.cmake" CACHE PATH "ToolChain file") -set(FREERDP_ANDROID_EXTERNAL_SSL_PATH $ENV{ANDROID_SSL_PATH} CACHE PATH "android ssl") +set(FREERDP_EXTERNAL_SSL_PATH $ENV{ANDROID_SSL_PATH} CACHE PATH "android ssl") # ANDROID_NDK and ANDROID_SDK must be set as environment variable #set(ANDROID_NDK $ENV{ANDROID_SDK} CACHE PATH "Android NDK") #set(ANDROID_SDK "${ANDROID_NDK}" CACHE PATH "android SDK") diff --git a/docs/README.android b/docs/README.android index 6896f8d89..7b0bf4fe2 100644 --- a/docs/README.android +++ b/docs/README.android @@ -31,10 +31,12 @@ Multiple source versions and builds of static openssl libraries are floating aro At the time of writing we have tested and used: https://github.com/bmiklautz/Android-external-openssl-ndk-static https://github.com/akallabeth/openssl-android -However, any other static build should work as well. -To build openssl: +For jpeg support https://github.com/akallabeth/jpeg8d has been tested and used. +However, any other static builds should work as well. +Build openssl and jpeg +====================== Set up ANDROID_NDK and ANDROID_SDK to the absolute paths on your machine. From the project root folder run './scripts/android_setup_build_env.sh' This will set up openssl and gprof helper libraries as required for FreeRDP. @@ -47,12 +49,13 @@ Integrated build ---------------- Run the following commands in the top level freerdp directory. Don't -forget to set ANDROID_NDK, ANDROID_SDK and FREERDP_ANDROID_EXTERNAL_SSL_PATH +forget to set ANDROID_NDK, ANDROID_SDK and FREERDP_EXTERNAL_SSL_PATH to the absolut paths on your machine: cmake -DCMAKE_TOOLCHAIN_FILE=cmake/AndroidToolchain.cmake \ -DANDROID_NDK="_your_ndk_path_here_" \ --DFREERDP_ANDROID_EXTERNAL_SSL_PATH="_your_ssl_build_root_path_" \ +-DFREERDP_EXTERNAL_SSL_PATH="_your_ssl_build_root_path_" \ +-DFREERDP_EXTERNAL_JPEG_PATH="_your_jpeg_build_root_path_" \ -DANDROID_SDK="_your_sdk_path_here_" \ -DCMAKE_BUILD_TYPE=Debug make @@ -62,12 +65,13 @@ After that you should have a client/Android/bin/aFreeRDP-debug.apk. Manual ant builds ----------------- First run cmake to prepare the build and build JNI. -Don't forget to set ANDROID_NDK, ANDROID_SDK and FREERDP_ANDROID_EXTERNAL_SSL_PATH +Don't forget to set ANDROID_NDK, ANDROID_SDK and FREERDP_EXTERNAL_SSL_PATH to the absolut paths on your machine: cmake -DCMAKE_TOOLCHAIN_FILE=cmake/AndroidToolchain.cmake \ -DANDROID_NDK="_your_ndk_path_here_" \ --DFREERDP_ANDROID_EXTERNAL_SSL_PATH="_your_ssl_build_root_path_" \ +-DFREERDP_EXTERNAL_SSL_PATH="_your_ssl_build_root_path_" \ +-DFREERDP_EXTERNAL_JPEG_PATH="_your_jpeg_build_root_path_" \ -DANDROID_SDK="_your_sdk_path_here_" -DANDROID_BUILD_JAVA=OFF \ -DCMAKE_BUILD_TYPE=Debug make @@ -85,7 +89,7 @@ the eclipse marketplace). cmake -DCMAKE_TOOLCHAIN_FILE=cmake/AndroidToolchain.cmake \ -DANDROID_NDK="_your_ndk_path_here_" \ --DFREERDP_ANDROID_EXTERNAL_SSL_PATH="_your_ssl_build_root_path_" \ +-DFREERDP_EXTERNAL_SSL_PATH="_your_ssl_build_root_path_" \ -DCMAKE_BUILD_TYPE=Debug -DANDROID_BUILD_JAVA=OFF make @@ -124,9 +128,12 @@ ANDROID_NDK (used from toolchain file) ANDROID_ABI (used from toolchain file) * Android ABI to build for (default is armeabi-v7a) -FREERDP_ANDROID_EXTERNAL_SSL_PATH (used by FindOpenSSL) +FREERDP_EXTERNAL_SSL_PATH (used by FindOpenSSL) * absolut root path to the prebuild static openssl libraries +FREERDP_EXTERNAL_JPEG_PATH (used by FindJPEG) +* absolute root path to the prebuild static jpeg libraries + WITH_DEBUG_ANDROID_JNI - enable debugging for JNI diff --git a/libfreerdp/codec/CMakeLists.txt b/libfreerdp/codec/CMakeLists.txt index f6e392f82..f0ba7f746 100644 --- a/libfreerdp/codec/CMakeLists.txt +++ b/libfreerdp/codec/CMakeLists.txt @@ -80,7 +80,8 @@ if(WITH_NEON) endif() if(WITH_JPEG) - set(FREERDP_JPEG_LIBS jpeg) + include_directories(${JPEG_INCLUDE_DIR}) + set(FREERDP_JPEG_LIBS ${JPEG_LIBRARIES}) endif() add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" diff --git a/scripts/android_setup_build_env.sh b/scripts/android_setup_build_env.sh index d7f151d32..f60fca422 100755 --- a/scripts/android_setup_build_env.sh +++ b/scripts/android_setup_build_env.sh @@ -6,15 +6,19 @@ # Specifically these are: # - OpenSSL # - Android NDK Profiler +# - Jpeg library # # Usage: # android_setup_build_env.sh -OPENSSL_SCM=https://github.com/akallabeth/openssl-android -NDK_PROFILER_SCM=https://github.com/richq/android-ndk-profiler +OPENSSL_SCM=https://github.com/akallabeth/openssl-android.git +NDK_PROFILER_SCM=https://github.com/richq/android-ndk-profiler.git +JPEG_LIBRARY_SCM=https://github.com/akallabeth/jpeg8d.git SCRIPT_NAME=`basename $0` + if [ $# -ne 1 ]; then + echo "Missing command line argument, current directory as root." ROOT=`pwd` ROOT=$ROOT/external @@ -42,27 +46,30 @@ if [ $RETVAL -ne 0 ]; then echo "Failed to execute git command [$RETVAL]" exit -3 fi - cd $OPENSSL_SRC make clean # The makefile has a bug, which aborts during # first compilation. Rerun make to build the whole lib. make make +make RETVAL=0 # TODO: Check, why 2 is returned. if [ $RETVAL -ne 0 ]; then echo "Failed to execute make command [$RETVAL]" exit -4 fi - # Copy the created library to the default openssl directory, # so that CMake will detect it automatically. SSL_ROOT=`find $OPENSSL_SRC -type d -name "openssl-?.?.*"` +if [ -z "$SSL_ROOT" ]; then + echo "OpenSSL was not build successfully, aborting." + exit -42 +fi +mkdir -p $SSL_ROOT/lib +cp $SSL_ROOT/*.a $SSL_ROOT/lib/ + rm -f $ROOT/openssl ln -s $SSL_ROOT $ROOT/openssl -mkdir -p $ROOT/openssl/obj/local/armeabi/ -cp $ROOT/openssl/libssl.a $ROOT/openssl/obj/local/armeabi/ -cp $ROOT/openssl/libcrypto.a $ROOT/openssl/obj/local/armeabi/ echo "Preparing NDK profiler..." NDK_PROFILER_SRC=$ROOT/android-ndk-profiler @@ -87,5 +94,30 @@ if [ $RETVAL -ne 0 ]; then exit -6 fi +echo "Preparing JPEG library..." +JPEG_LIBRARY_SRC=$ROOT/jpeg8d +if [ -d $JPEG_LIBRARY_SRC ]; then + cd $JPEG_LIBRARY_SRC + git pull + RETVAL=$? +else + git clone $JPEG_LIBRARY_SCM $JPEG_LIBRARY_SRC + RETVAL=$? +fi +if [ $RETVAL -ne 0 ]; then + echo "Failed to execute git command [$RETVAL]" + exit -6 +fi +cd $JPEG_LIBRARY_SRC +ndk-build V=1 APP_ABI=armeabi-v7a clean +ndk-build V=1 APP_ABI=armeabi-v7a +RETVAL=$? +if [ $RETVAL -ne 0 ]; then + echo "Failed to execute ndk-build command [$RETVAL]" + exit -7 +fi +mkdir -p $JPEG_LIBRARY_SRC/lib +cp $JPEG_LIBRARY_SRC/obj/local/armeabi-v7a/*.a $JPEG_LIBRARY_SRC/lib/ + echo "Prepared external libraries, you can now build the application." exit 0