diff --git a/CMakeLists.txt b/CMakeLists.txt index 0f8f5cf0..93fb0091 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -732,6 +732,16 @@ elseif(EMSCRIPTEN) target_sources(lovr PRIVATE src/core/os_wasm.c) configure_file(etc/lovr.ico favicon.ico COPYONLY) elseif(ANDROID) + set(ANDROID_MANIFEST "${CMAKE_CURRENT_SOURCE_DIR}/etc/AndroidManifest.xml" CACHE STRING "The AndroidManifest.xml file to use") + file(READ ${ANDROID_MANIFEST} ANDROID_MANIFEST_CONTENT) + string(REGEX MATCH "package=\"([^\"]*)" _ ${ANDROID_MANIFEST_CONTENT}) + set(ANDROID_PACKAGE ${CMAKE_MATCH_1}) + + string(REPLACE "." "_" ANDROID_PACKAGE_C ${ANDROID_PACKAGE}) + string(REPLACE "." "/" ANDROID_PACKAGE_JAVA ${ANDROID_PACKAGE}) + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/etc/Activity.java ${CMAKE_CURRENT_BINARY_DIR}/Activity.java) + target_compile_definitions(lovr PRIVATE "LOVR_JAVA_PACKAGE=${ANDROID_PACKAGE_C}") + target_sources(lovr PRIVATE src/core/os_android.c) target_link_libraries(lovr log android dl) target_include_directories(lovr PRIVATE "${ANDROID_NDK}/sources/android/native_app_glue") @@ -747,17 +757,12 @@ elseif(ANDROID) if(LOVR_BUILD_EXE) set(ANDROID_JAR "${ANDROID_SDK}/platforms/${ANDROID_PLATFORM}/android.jar") set(ANDROID_TOOLS "${ANDROID_SDK}/build-tools/${ANDROID_BUILD_TOOLS_VERSION}") - set(ANDROID_MANIFEST "${CMAKE_CURRENT_SOURCE_DIR}/etc/AndroidManifest.xml" CACHE STRING "The AndroidManifest.xml file to use") # If assets are included in the apk then add '-A assets' to aapt, otherwise don't add any flags if(ANDROID_ASSETS) set(ANDROID_ASSETS -A ${ANDROID_ASSETS}) endif() - if(ANDROID_PACKAGE) - set(PACKAGE_RENAME "--rename-manifest-package" "${ANDROID_PACKAGE}") - endif() - if(LOVR_USE_OPENXR) add_custom_command(TARGET move_files POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy @@ -793,9 +798,8 @@ elseif(ANDROID) buildAPK ALL WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_COMMAND} -E copy "${ANDROID_MANIFEST}" AndroidManifest.xml - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/etc/Activity.java Activity.java COMMAND ${Java_JAVAC_EXECUTABLE} -classpath "${ANDROID_JAR}" -d . Activity.java - COMMAND ${ANDROID_TOOLS}/d8 --min-api ${ANDROID_NATIVE_API_LEVEL} --output raw org/lovr/app/Activity.class + COMMAND ${ANDROID_TOOLS}/d8 --min-api ${ANDROID_NATIVE_API_LEVEL} --output raw ${ANDROID_PACKAGE_JAVA}/Activity.class COMMAND ${ANDROID_TOOLS}/aapt package -f diff --git a/etc/Activity.java b/etc/Activity.java index 9f0ccd50..345a115c 100644 --- a/etc/Activity.java +++ b/etc/Activity.java @@ -1,4 +1,4 @@ -package org.lovr.app; +package @ANDROID_PACKAGE@; import android.Manifest; import android.app.NativeActivity; diff --git a/src/core/os_android.c b/src/core/os_android.c index 3c9d4eed..ce6925c4 100644 --- a/src/core/os_android.c +++ b/src/core/os_android.c @@ -241,7 +241,10 @@ void os_sleep(double seconds) { while (nanosleep(&t, &t)); } -JNIEXPORT void JNICALL Java_org_lovr_app_Activity_lovrPermissionEvent(JNIEnv* jni, jobject activity, jint permission, jboolean granted) { +#define _JNI(PKG, X) Java_ ## PKG ## _ ## X +#define JNI(PKG, X) _JNI(PKG, X) + +JNIEXPORT void JNICALL JNI(LOVR_JAVA_PACKAGE, Activity_lovrPermissionEvent)(JNIEnv* jni, jobject activity, jint permission, jboolean granted) { if (state.onPermissionEvent) { state.onPermissionEvent(permission, granted); }