Get Android base USB connection working

This commit is contained in:
Lorenzooone 2025-04-29 21:21:03 +02:00
parent 5dbdc668a7
commit 2404287c7c
6 changed files with 69 additions and 21 deletions

View File

@ -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")

View File

@ -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}

View File

@ -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)

View File

@ -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}

View File

@ -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)

View File

@ -2,6 +2,15 @@
#include <thread>
#include <mutex>
#ifdef SFML_SYSTEM_ANDROID
// These headers are only needed for direct NDK/JDK interaction
#include <android/native_activity.h>
#include <jni.h>
// Since we want to get the native activity from SFML, we'll have to use an
// extra header here:
#include <SFML/System/NativeActivity.hpp>
#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;