From a04ee42c0df5965a76571328d47ef23de85ddbc0 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 18 Nov 2014 11:13:24 -0800 Subject: [PATCH] complete successful apk creation via androiddeployqt --- cmake/android/AndroidManifest.xml.in | 41 +--- cmake/android/Apk.cmake | 272 -------------------------- cmake/android/LoadLibraries.java.in | 19 -- cmake/android/QtCreateAPK.cmake | 18 +- cmake/android/deployment-file.json.in | 2 +- cmake/android/strings.xml.in | 7 - gvr-interface/CMakeLists.txt | 8 +- gvr-interface/src/main.cpp | 48 +---- 8 files changed, 23 insertions(+), 392 deletions(-) delete mode 100755 cmake/android/Apk.cmake delete mode 100755 cmake/android/LoadLibraries.java.in delete mode 100755 cmake/android/strings.xml.in diff --git a/cmake/android/AndroidManifest.xml.in b/cmake/android/AndroidManifest.xml.in index cc451e7d1a..2242fd57d1 100755 --- a/cmake/android/AndroidManifest.xml.in +++ b/cmake/android/AndroidManifest.xml.in @@ -2,43 +2,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/cmake/android/Apk.cmake b/cmake/android/Apk.cmake deleted file mode 100755 index d5466da87b..0000000000 --- a/cmake/android/Apk.cmake +++ /dev/null @@ -1,272 +0,0 @@ -#*********************************************************# -#* File: Apk.cmake * -#* Android apk tools -#* -#* Copyright (C) 2002-2013 The PixelLight Team (http://www.pixellight.org/) -#* -#* This file is part of PixelLight. -#* -#* Permission is hereby granted, free of charge, to any person obtaining a copy of this software -#* and associated documentation files (the "Software"), to deal in the Software without -#* restriction, including without limitation the rights to use, copy, modify, merge, publish, -#* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the -#* Software is furnished to do so, subject to the following conditions: -#* -#* The above copyright notice and this permission notice shall be included in all copies or -#* substantial portions of the Software. -#* -#* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING -#* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -#* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -#* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -#* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -#*********************************************************# - - -################################################## -## Options -################################################## -set(ANDROID_APK_CREATE "1" CACHE BOOL "Create apk file?") -set(ANDROID_APK_INSTALL "1" CACHE BOOL "Install created apk file on the device automatically?") -set(ANDROID_APK_RUN "1" CACHE BOOL "Run created apk file on the device automatically? (installs it automatically as well, \"ANDROID_APK_INSTALL\"-option is ignored)") -set(ANDROID_APK_TOP_LEVEL_DOMAIN "io" CACHE STRING "Top level domain name of the organization (follow the package naming conventions (http://en.wikipedia.org/wiki/Java_package#Package_naming_conventions))") -set(ANDROID_APK_DOMAIN "highfidelity" CACHE STRING "Organization's domain (follow the package naming conventions (http://en.wikipedia.org/wiki/Java_package#Package_naming_conventions))") -set(ANDROID_APK_SUBDOMAIN "gvrinterface" CACHE STRING "Any subdomains (follow the package naming conventions (http://en.wikipedia.org/wiki/Java_package#Package_naming_conventions))") -set(ANDROID_APK_FULLSCREEN "1" CACHE BOOL "Run the application in fullscreen? (no status/title bar)") -set(ANDROID_APK_RELEASE "0" CACHE BOOL "Create apk file ready for release? (signed, you have to enter a password during build, do also setup \"ANDROID_APK_SIGNER_KEYSTORE\" and \"ANDROID_APK_SIGNER_ALIAS\")") -set(ANDROID_APK_SIGNER_KEYSTORE "~/my-release-key.keystore" CACHE STRING "Keystore for signing the apk file (only required for release apk)") -set(ANDROID_APK_SIGNER_ALIAS "myalias" CACHE STRING "Alias for signing the apk file (only required for release apk)") - - -################################################## -## Variables -################################################## -set(ANDROID_THIS_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) # Directory this CMake file is in - - -################################################## -## MACRO: android_create_apk -## -## Create/copy Android apk related files -## -## @param name -## Name of the project (e.g. "MyProject"), this will also be the name of the created apk file -## @param apk_directory -## Directory were to construct the apk file in (e.g. "${CMAKE_BINARY_DIR}/apk") -## @param shared_libraries -## List of shared libraries (absolute filenames) this application is using, these libraries are copied into the apk file and will be loaded automatically within a generated Java file - Lookout! The order is important due to shared library dependencies! -## @param assets -## List of assets to copy into the apk file (absolute filenames, wildcards like "*.*" are allowed) -## @param data_directory -## Subdirectory within the apk asset directory to copy the "assets"-files into (e.g. "Data") -## -## @remarks -## Requires the following tools to be found automatically -## - "android" (part of the Android SDK) -## - "adb" (part of the Android SDK) -## - "ant" (type e.g. "sudo apt-get install ant" on your Linux system to install Ant) -## - "jarsigner" (part of the JDK) -## - "zipalign" (part of the Android SDK) -################################################## -macro(android_create_apk name apk_directory shared_libraries static_libraries jar_libraries assets data_directory) - if(ANDROID_APK_CREATE) - # Construct the current package name and theme - set(ANDROID_APK_PACKAGE "${ANDROID_APK_TOP_LEVEL_DOMAIN}.${ANDROID_APK_DOMAIN}.${ANDROID_APK_SUBDOMAIN}") - - set(ANDROID_NAME ${name}) - if(CMAKE_BUILD_TYPE MATCHES Debug) - set(ANDROID_APK_DEBUGGABLE "true") - set(ANDROID_APK_RELEASE_LOCAL "0") - else() - set(ANDROID_APK_DEBUGGABLE "false") - set(ANDROID_APK_RELEASE_LOCAL ${ANDROID_APK_RELEASE}) - endif() - - # Create "AndroidManifest.xml" - configure_file("${ANDROID_THIS_DIRECTORY}/AndroidManifest.xml.in" "${apk_directory}/AndroidManifest.xml") - - # Create "res/values/strings.xml" - configure_file("${ANDROID_THIS_DIRECTORY}/strings.xml.in" "${apk_directory}/res/values/strings.xml") - - # Get a list of libraries to load in (e.g. "PLCore;PLMath" etc.) - set(ANDROID_SHARED_LIBRARIES_TO_LOAD "") - foreach(value ${shared_libraries}) - # "value" is e.g. "/home/cofenberg/pl_ndk/Bin-Linux-ndk/Runtime/armeabi/libPLCore.so" - get_filename_component(shared_library_filename ${value} NAME_WE) - - # "shared_library_filename" is e.g. "libPLCore", but we need "PLCore" - string(LENGTH ${shared_library_filename} shared_library_filename_length) - math(EXPR shared_library_filename_length ${shared_library_filename_length}-3) - string(SUBSTRING ${shared_library_filename} 3 ${shared_library_filename_length} shared_library_filename) - - # "shared_library_filename" is now e.g. "PLCore", this is what we want -> Add it to the list - set(ANDROID_SHARED_LIBRARIES_TO_LOAD ${ANDROID_SHARED_LIBRARIES_TO_LOAD} ${shared_library_filename}) - endforeach() - - # Create Java file which is responsible for loading in the required shared libraries (the content of "ANDROID_SHARED_LIBRARIES_TO_LOAD" is used for this) - configure_file("${ANDROID_THIS_DIRECTORY}/LoadLibraries.java.in" "${apk_directory}/src/${ANDROID_APK_TOP_LEVEL_DOMAIN}/${ANDROID_APK_DOMAIN}/${ANDROID_APK_SUBDOMAIN}/LoadLibraries.java") - - # Create the directory for the libraries - add_custom_command(TARGET ${ANDROID_NAME} - PRE_BUILD - COMMAND ${CMAKE_COMMAND} -E remove_directory "${apk_directory}/libs" - ) - add_custom_command(TARGET ${ANDROID_NAME} - PRE_BUILD - COMMAND ${CMAKE_COMMAND} -E make_directory "${apk_directory}/libs/${ARM_TARGET}" - ) - - # Copy the used shared libraries - foreach(value ${shared_libraries}) - add_custom_command(TARGET ${ANDROID_NAME} - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${value} "${apk_directory}/libs/${ARM_TARGET}" - ) - endforeach() - - # Copy the used shared libraries - foreach(value ${static_libraries}) - add_custom_command(TARGET ${ANDROID_NAME} - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${value} "${apk_directory}/libs/${ARM_TARGET}" - ) - endforeach() - - # Copy any required external jars to the libs folder - foreach(value ${jar_libraries}) - add_custom_command(TARGET ${ANDROID_NAME} - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${value} "${apk_directory}/libs/" - ) - endforeach() - - # Create "build.xml", "default.properties", "local.properties" and "proguard.cfg" files - add_custom_command(TARGET ${ANDROID_NAME} - COMMAND android update project -t android-${ANDROID_API_LEVEL} --name ${ANDROID_NAME} --path "${apk_directory}" - ) - - # Copy assets - add_custom_command(TARGET ${ANDROID_NAME} - PRE_BUILD - COMMAND ${CMAKE_COMMAND} -E remove_directory "${apk_directory}/assets" - ) - add_custom_command(TARGET ${ANDROID_NAME} - PRE_BUILD - COMMAND ${CMAKE_COMMAND} -E make_directory "${apk_directory}/assets/${data_directory}" - ) - foreach(value ${assets}) - android_copy_files(${value} "${apk_directory}/assets/${data_directory}") - endforeach() - - # In case of debug build, do also copy gdbserver - if(CMAKE_BUILD_TYPE MATCHES Debug) - add_custom_command(TARGET ${ANDROID_NAME} - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_GDBSERVER} "${apk_directory}/libs/${ARM_TARGET}" - ) - endif() - - # Uninstall previous version from the device/emulator (else we may get e.g. signature conflicts) - add_custom_command(TARGET ${ANDROID_NAME} - COMMAND adb uninstall ${ANDROID_APK_PACKAGE} - ) - - # Build the apk file - if(ANDROID_APK_RELEASE_LOCAL) - # Let Ant create the unsigned apk file - add_custom_command(TARGET ${ANDROID_NAME} - COMMAND ant release - WORKING_DIRECTORY "${apk_directory}" - ) - - # Sign the apk file - add_custom_command(TARGET ${ANDROID_NAME} - COMMAND jarsigner -verbose -keystore ${ANDROID_APK_SIGNER_KEYSTORE} bin/${ANDROID_NAME}-unsigned.apk ${ANDROID_APK_SIGNER_ALIAS} - WORKING_DIRECTORY "${apk_directory}" - ) - - # Align the apk file - add_custom_command(TARGET ${ANDROID_NAME} - COMMAND zipalign -v -f 4 bin/${ANDROID_NAME}-unsigned.apk bin/${ANDROID_NAME}.apk - WORKING_DIRECTORY "${apk_directory}" - ) - - # Install current version on the device/emulator - if(ANDROID_APK_INSTALL OR ANDROID_APK_RUN) - add_custom_command(TARGET ${ANDROID_NAME} - COMMAND adb install -r bin/${ANDROID_NAME}.apk - WORKING_DIRECTORY "${apk_directory}" - ) - endif() - else() - # Let Ant create the unsigned apk file - add_custom_command(TARGET ${ANDROID_NAME} - COMMAND ant debug - WORKING_DIRECTORY "${apk_directory}" - ) - - # Install current version on the device/emulator - if(ANDROID_APK_INSTALL OR ANDROID_APK_RUN) - add_custom_command(TARGET ${ANDROID_NAME} - COMMAND adb install -r bin/${ANDROID_NAME}-debug.apk - WORKING_DIRECTORY "${apk_directory}" - ) - endif() - endif() - - # Start the application - if(ANDROID_APK_RUN) - add_custom_command(TARGET ${ANDROID_NAME} - COMMAND adb shell am start -n ${ANDROID_APK_PACKAGE}/${ANDROID_APK_PACKAGE}.LoadLibraries - ) - endif() - endif() -endmacro(android_create_apk name apk_directory shared_libraries assets data_directory) - -################################################## -## MACRO: android_copy_files -## -## Copy files from one place to another using wildcards -################################################## -macro(android_copy_files src dest) - # Get path - get_filename_component(path ${src} PATH) - - # Get exclude option - set(exclude) - if("${ARGV2}" STREQUAL "EXCLUDE") - set(exclude ${ARGV3}) - endif() - - # Find files - file(GLOB_RECURSE files RELATIVE ${path} ${src}) - - # Find files - foreach(file ${files}) - # Get source and destination file - set(src_file ${path}/${file}) - set(dst_file ${dest}/${file}) - - # Check exclude expression - set(copy 1) - if(exclude) - if(file MATCHES ${exclude}) - set(copy 0) - endif() - endif() - - # Process file - if(copy EQUAL 1) - # Create output directory - get_filename_component(dst_path ${dst_file} PATH) - file(MAKE_DIRECTORY ${dst_path}) - - # Copy file - add_custom_command(TARGET ${ANDROID_NAME} - PRE_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${src_file} ${dst_file} VERBATIM - ) - endif() - endforeach(file ${files}) -endmacro(android_copy_files src dest) - diff --git a/cmake/android/LoadLibraries.java.in b/cmake/android/LoadLibraries.java.in deleted file mode 100755 index 6832128e35..0000000000 --- a/cmake/android/LoadLibraries.java.in +++ /dev/null @@ -1,19 +0,0 @@ -// IMPORTANT: Do not manually manipulate this automatically generated file, changes will be gone after the next build! - -package ${ANDROID_APK_TOP_LEVEL_DOMAIN}.${ANDROID_APK_DOMAIN}.${ANDROID_APK_SUBDOMAIN}; - -import android.app.NativeActivity; - -public class LoadLibraries extends NativeActivity { - - static { - // List of libraries to load in (e.g. "PLCore;PLMath" etc.) - String sharedLibrariesToLoad = "${ANDROID_SHARED_LIBRARIES_TO_LOAD}"; - - // Load in all shared libraries - String [] libraries = sharedLibrariesToLoad.split(";"); - for (int i=0; i - - - - - ${ANDROID_APP_NAME} - diff --git a/gvr-interface/CMakeLists.txt b/gvr-interface/CMakeLists.txt index 46408657c3..e40bcadc01 100644 --- a/gvr-interface/CMakeLists.txt +++ b/gvr-interface/CMakeLists.txt @@ -1,6 +1,11 @@ set(TARGET_NAME gvr-interface) -set(${TARGET_NAME}_SHARED true) +set(ANDROID_APK_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/apk-build") +set(ANDROID_APK_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/apk") + +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${ANDROID_APK_OUTPUT_DIR}/libs/${ANDROID_ABI}") +set(BUILD_SHARED_LIBS ON) + setup_hifi_library() include_glm() @@ -15,6 +20,5 @@ set(ANDROID_APP_NAME Interface) set(ANDROID_API_LEVEL 19) set(ANDROID_APK_PACKAGE io.highfidelity.gvrinterface) set(ANDROID_APK_FULLSCREEN true) -set(ANDROID_APK_DIR "${CMAKE_CURRENT_BINARY_DIR}/apk") qt_create_apk() \ No newline at end of file diff --git a/gvr-interface/src/main.cpp b/gvr-interface/src/main.cpp index 6bae565605..037761e6e3 100644 --- a/gvr-interface/src/main.cpp +++ b/gvr-interface/src/main.cpp @@ -9,49 +9,9 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include -#include +#include -// usage of log -#define APP_NAME "Interface" - -// usage of log -#define LOGINFO(x...) __android_log_print(ANDROID_LOG_INFO, APP_NAME, x) - -// handle commands -static void custom_handle_cmd(struct android_app* app, int32_t cmd) { - switch(cmd) { - case APP_CMD_INIT_WINDOW: - LOGINFO("GearVR Interface, reporting for duty"); - break; - } -} - -void android_main(struct android_app* state) { - // Make sure glue isn't stripped. - app_dummy(); - - int events; - - // set up so when commands happen we call our custom handler - state->onAppCmd = custom_handle_cmd; - - while (1) { - struct android_poll_source* source; - - // we block for events - while (ALooper_pollAll(-1, NULL, &events, (void**)&source) >= 0) { - - // Process this event. - if (source != NULL) { - source->process(state, source); - } - - // Check if we are exiting. - if (state->destroyRequested != 0) { - LOGINFO("We are exiting"); - return; - } - } - } +int main(int argc, char* argv[]) { + QGuiApplication app(argc, argv); + return app.exec(); } \ No newline at end of file