diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index fd45e93..7f91a6d 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -1,5 +1,4 @@ val NDK_VERSION by extra(project.properties["NDK_VERSION"] as? String ?: "26.1.10909125") -val ARCH_ABI by extra(project.properties["ARCH_ABI"] as? String ?: "arm64-v8a") val MIN_SDK by extra((project.properties["MIN_SDK"] as? String ?: "21").toInt()) val TARGET_SDK by extra((project.properties["TARGET_SDK"] as? String ?: "33").toInt()) val STL_TYPE by extra(project.properties["STL_TYPE"] as? String ?: "c++_shared") @@ -19,9 +18,7 @@ android { targetSdk = TARGET_SDK versionCode = 1 versionName = "1.0" - ndk { - abiFilters.add(ARCH_ABI) - } + externalNativeBuild { cmake { arguments.add("-DCMAKE_SYSTEM_NAME=Android") @@ -36,6 +33,17 @@ android { proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") } } + bundle { + language { + enableSplit = false + } + density { + enableSplit = false + } + abi { + enableSplit = true + } + } externalNativeBuild { cmake { path("../../CMakeLists.txt") diff --git a/docker-scripts/docker_build_android b/docker-scripts/docker_build_android index bc74938..9d891a2 100644 --- a/docker-scripts/docker_build_android +++ b/docker-scripts/docker_build_android @@ -2,9 +2,12 @@ SFML_EXTRACTED_TO_FOLDER=~ LIBUSB_EXTRACTED_TO_FOLDER=~ -SFML_EXTRACTED_FOLDER=${SFML_EXTRACTED_TO_FOLDER}/SFML-master -LIBUSB_EXTRACTED_FOLDER=${LIBUSB_EXTRACTED_TO_FOLDER}/libusb-master -BUILD_ARCH_COMMAND=docker-scripts/docker_build_android_single_arch +SFML_BRANCH_NAME=master +LIBUSB_BRANCH_NAME=android-rebase-2022-07 +SFML_EXTRACTED_FOLDER=${SFML_EXTRACTED_TO_FOLDER}/SFML-${SFML_BRANCH_NAME} +LIBUSB_EXTRACTED_FOLDER=${LIBUSB_EXTRACTED_TO_FOLDER}/libusb-${LIBUSB_BRANCH_NAME} +BUILD_APK_COMMAND=docker-scripts/docker_build_android_apk +BUILD_LIBS_COMMAND=docker-scripts/docker_build_android_libraries STL_CHOSEN=c++_static RELEASE_TYPE=Debug @@ -13,8 +16,9 @@ ANDROID_FOLDER=android export LANG=C.UTF-8 -(cd ${SFML_EXTRACTED_TO_FOLDER} ; rm -f master.zip ; wget https://github.com/SFML/SFML/archive/refs/heads/master.zip ; unzip master.zip) -(cd ${LIBUSB_EXTRACTED_TO_FOLDER} ; rm -f master.zip ; wget https://github.com/libusb/libusb/archive/refs/heads/master.zip ; unzip master.zip) -(cd ${LIBUSB_EXTRACTED_FOLDER}/android/jni ; ndk-build ; mkdir -p ${ANDROID_NDK_HOME}/sources/third_party/libusb/include ; cp -r ../libs/ ${ANDROID_NDK_HOME}/sources/third_party/libusb ; cp -r ../../libusb ${ANDROID_NDK_HOME}/sources/third_party/libusb/include ) -#${BUILD_ARCH_COMMAND} ${SFML_EXTRACTED_FOLDER} armeabi-v7a ${STL_CHOSEN} ${RELEASE_TYPE} ${OUT_FOLDER} ${ANDROID_FOLDER} -${BUILD_ARCH_COMMAND} ${SFML_EXTRACTED_FOLDER} arm64-v8a ${STL_CHOSEN} ${RELEASE_TYPE} ${OUT_FOLDER} ${ANDROID_FOLDER} +(cd ${SFML_EXTRACTED_TO_FOLDER} ; rm -f ${SFML_BRANCH_NAME}.zip ; wget https://github.com/SFML/SFML/archive/refs/heads/${SFML_BRANCH_NAME}.zip ; unzip ${SFML_BRANCH_NAME}.zip) +(cd ${LIBUSB_EXTRACTED_TO_FOLDER} ; rm -f ${LIBUSB_BRANCH_NAME}.zip ; wget https://github.com/jagheterfredrik/libusb/archive/refs/heads/${LIBUSB_BRANCH_NAME}.zip ; unzip ${LIBUSB_BRANCH_NAME}.zip) + +${BUILD_LIBS_COMMAND} ${LIBUSB_EXTRACTED_FOLDER} ${SFML_EXTRACTED_FOLDER} ${STL_CHOSEN} ${RELEASE_TYPE} + +${BUILD_APK_COMMAND} ${STL_CHOSEN} ${RELEASE_TYPE} ${OUT_FOLDER} ${ANDROID_FOLDER} diff --git a/docker-scripts/docker_build_android_single_arch b/docker-scripts/docker_build_android_apk similarity index 60% rename from docker-scripts/docker_build_android_single_arch rename to docker-scripts/docker_build_android_apk index 80a7490..e0f2455 100644 --- a/docker-scripts/docker_build_android_single_arch +++ b/docker-scripts/docker_build_android_apk @@ -1,11 +1,9 @@ #!/bin/sh -SFML_FOLDER=$1 -ARCH_CHOSEN=$2 -STL_CHOSEN=$3 -RELEASE_TYPE=$4 -OUT_FOLDER=$5 -ANDROID_FOLDER=$6 +STL_CHOSEN=$1 +RELEASE_TYPE=$2 +OUT_FOLDER=$3 +ANDROID_FOLDER=$4 GRADLE_FLAGS="" add_to_gradle_flags() @@ -19,10 +17,7 @@ to_lower() echo "$1" | tr '[:upper:]' '[:lower:]' } -(cd ${SFML_FOLDER} ; mkdir -p build/${ARCH_CHOSEN}) -(cd ${SFML_FOLDER}/build/${ARCH_CHOSEN} ; cmake -DCMAKE_SYSTEM_NAME=Android -DCMAKE_ANDROID_NDK=${ANDROID_NDK_HOME} -DCMAKE_ANDROID_ARCH_ABI=${ARCH_CHOSEN} -DCMAKE_ANDROID_STL_TYPE=${STL_CHOSEN} -DCMAKE_BUILD_TYPE=${RELEASE_TYPE} ../.. ; make ; make install) add_to_gradle_flags NDK_VERSION=${ANDROID_NDK_VERSION} -add_to_gradle_flags ARCH_ABI=${ARCH_CHOSEN} add_to_gradle_flags TARGET_SDK=${ANDROID_SDK_VERSION} add_to_gradle_flags STL_TYPE=${STL_CHOSEN} LOWER_RELEASE_TYPE=$(to_lower $RELEASE_TYPE) diff --git a/docker-scripts/docker_build_android_libraries b/docker-scripts/docker_build_android_libraries new file mode 100644 index 0000000..0b30e9a --- /dev/null +++ b/docker-scripts/docker_build_android_libraries @@ -0,0 +1,15 @@ +#!/bin/sh + +LIBUSB_FOLDER=$1 +SFML_FOLDER=$2 +STL_CHOSEN=$3 +RELEASE_TYPE=$4 + +BUILD_SINGLE_ARCH_SFML_COMMAND=docker-scripts/docker_build_android_sfml_single_arch + +(cd ${LIBUSB_FOLDER}/android/jni ; ndk-build APP_PLATFORM=${ANDROID_SDK_VERSION} ; mkdir -p ${ANDROID_NDK_HOME}/sources/third_party/libusb/include ; cp -r ../libs/ ${ANDROID_NDK_HOME}/sources/third_party/libusb ; cp -r ../../libusb ${ANDROID_NDK_HOME}/sources/third_party/libusb/include) + +${BUILD_SINGLE_ARCH_SFML_COMMAND} ${SFML_FOLDER} armeabi-v7a ${STL_CHOSEN} ${RELEASE_TYPE} +${BUILD_SINGLE_ARCH_SFML_COMMAND} ${SFML_FOLDER} arm64-v8a ${STL_CHOSEN} ${RELEASE_TYPE} +${BUILD_SINGLE_ARCH_SFML_COMMAND} ${SFML_FOLDER} x86 ${STL_CHOSEN} ${RELEASE_TYPE} +${BUILD_SINGLE_ARCH_SFML_COMMAND} ${SFML_FOLDER} x86_64 ${STL_CHOSEN} ${RELEASE_TYPE} diff --git a/docker-scripts/docker_build_android_sfml_single_arch b/docker-scripts/docker_build_android_sfml_single_arch new file mode 100644 index 0000000..a68ecf8 --- /dev/null +++ b/docker-scripts/docker_build_android_sfml_single_arch @@ -0,0 +1,9 @@ +#!/bin/sh + +SFML_FOLDER=$1 +ARCH_CHOSEN=$2 +STL_CHOSEN=$3 +RELEASE_TYPE=$4 + +(cd ${SFML_FOLDER} ; mkdir -p build/${ARCH_CHOSEN}) +(cd ${SFML_FOLDER}/build/${ARCH_CHOSEN} ; cmake -DCMAKE_SYSTEM_NAME=Android -DCMAKE_ANDROID_NDK=${ANDROID_NDK_HOME} -DCMAKE_ANDROID_ARCH_ABI=${ARCH_CHOSEN} -DCMAKE_ANDROID_STL_TYPE=${STL_CHOSEN} -DCMAKE_BUILD_TYPE=${RELEASE_TYPE} ../.. ; make ; make install) diff --git a/source/CaptureDeviceSpecific/usb_generic.cpp b/source/CaptureDeviceSpecific/usb_generic.cpp index ff22de8..e8eeb3b 100644 --- a/source/CaptureDeviceSpecific/usb_generic.cpp +++ b/source/CaptureDeviceSpecific/usb_generic.cpp @@ -2,6 +2,15 @@ #include #include +#ifdef SFML_SYSTEM_ANDROID +// These headers are only needed for direct NDK/JDK interaction +#include +#include +// Since we want to get the native activity from SFML, we'll have to use an +// extra header here: +#include +#endif + static bool usb_initialized = false; static libusb_context* usb_ctx = NULL; // libusb session context static int usb_thread_registered = 0; @@ -11,6 +20,14 @@ std::mutex usb_thread_mutex; void usb_init() { if(usb_initialized) return; + #ifdef SFML_SYSTEM_ANDROID + // First we'll need the native activity handle + ANativeActivity& activity = *sf::getNativeActivity(); + // Retrieve the JVM and JNI environment + JavaVM& vm = *activity.vm; + JNIEnv& env = *activity.env; + libusb_set_option(usb_ctx, LIBUSB_OPTION_ANDROID_JAVAVM, &vm); + #endif int result = libusb_init(&usb_ctx); // open session if (result < 0) { usb_ctx = NULL;