diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..cc21af7 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,10 @@ +FROM beigirad/tiny-android +RUN apt-get update -qq && apt-get install -y --no-install-recommends \ + cmake ninja-build openjdk-11-jdk wget unzip python3 && apt-get clean && rm -rf /var/lib/apt/lists/* +# Install Gradle 7.5 (compatible with Android Gradle plugin 7.2.1) +RUN wget -q https://services.gradle.org/distributions/gradle-7.5-bin.zip -O /tmp/gradle.zip && \ + unzip -q /tmp/gradle.zip -d /opt && \ + rm /tmp/gradle.zip +ENV GRADLE_HOME=/opt/gradle-7.5 +ENV PATH=$PATH:$GRADLE_HOME/bin +WORKDIR /workspace diff --git a/Source/Application/CMakeLists.txt b/Source/Application/CMakeLists.txt index af03155..15c8519 100644 --- a/Source/Application/CMakeLists.txt +++ b/Source/Application/CMakeLists.txt @@ -1,8 +1,12 @@ # Include source files. file (GLOB_RECURSE SOURCE_FILES *.h *.cpp) -# Add dynamic or static library. -add_library (${APP_PLUGIN_NAME} ${SOURCE_FILES}) +if (ANDROID) + add_library(${APP_PLUGIN_NAME} STATIC ${SOURCE_FILES}) + target_compile_definitions(${APP_PLUGIN_NAME} PRIVATE URHO3D_STATIC=1) +else() + add_library(${APP_PLUGIN_NAME} ${SOURCE_FILES}) +endif () # Link the engine and dependencies. target_link_libraries (${APP_PLUGIN_NAME} PRIVATE diff --git a/android/assets/Cache/common_cache.txt b/android/assets/Cache/common_cache.txt new file mode 100644 index 0000000..bb1f62c --- /dev/null +++ b/android/assets/Cache/common_cache.txt @@ -0,0 +1 @@ +When editor import files it will place assets in the Cache folder. \ No newline at end of file diff --git a/android/assets/ResourceRoot.ini b/android/assets/ResourceRoot.ini new file mode 100644 index 0000000..6de333e --- /dev/null +++ b/android/assets/ResourceRoot.ini @@ -0,0 +1,3 @@ +CoreData=CoreData +Data=Data +Cache=Cache diff --git a/android/build.gradle b/android/build.gradle index 07b05eb..310bad2 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -2,9 +2,10 @@ apply plugin: 'com.android.application' // Relative path to engine source code directory. Modify as required. def projectSourceDir = '..' -// Relative path to project source code directory. Modify as required. -def rbfxSourceDir = '../3rdParty/rbfx' +// Relative path to engine source code directory. Modify as required. +def sdkPath = '../rebelfork-sdk-android-clang-arm64-dll-latest' // Minimum required CMake version. This is same as in ../CMakeLists.txt. +def cmakeSdkPath = '"$projectDir/../../../rebelfork-sdk-android-clang-arm64-dll-latest"' def cmakeVersion = '3.22.0.0+' buildscript { @@ -28,12 +29,15 @@ android { minSdkVersion 17 targetSdkVersion 32 ndk { - abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86_64' + abiFilters 'arm64-v8a' } externalNativeBuild { cmake { - arguments '-DANDROID_STL=c++_static', '-DANDROID_PLATFORM=android-21', '-DANDROID=1', - '-DANDROID_ARM_MODE=arm', '-DBUILD_SHARED_LIBS=OFF' + arguments '-DANDROID_STL=c++_shared', '-DANDROID_PLATFORM=android-21', '-DANDROID=1', + '-DANDROID_ARM_MODE=arm', '-DBUILD_SHARED_LIBS=ON', + '-DCMAKE_PREFIX_PATH=' + new File(projectDir, '../rebelfork-sdk-android-clang-arm64-dll-latest/share').absolutePath, + '-DUrho3D_DIR=' + new File(projectDir, '../rebelfork-sdk-android-clang-arm64-dll-latest/share/Urho3D/CMake').absolutePath, + '-DPACKAGE_TOOL_EXECUTABLE=python3 ' + new File(projectDir, '../rebelfork-sdk-android-clang-arm64-dll-latest/bin/PackageTool.py').absolutePath } } } @@ -52,7 +56,7 @@ android { } sourceSets.main { manifest.srcFile 'AndroidManifest.xml' - java.srcDirs = ['src', "${rbfxSourceDir}/Source/ThirdParty/SDL/android-project/app/src/main/java"] + java.srcDirs = ['src', "${sdkPath}/share/Urho3D/Android/java"] res.srcDirs = ['res', "${projectSourceDir}/StoreArt/Android/Icons"] assets.srcDirs = ['assets', "${projectSourceDir}/Project"] } diff --git a/build-android.sh b/build-android.sh new file mode 100755 index 0000000..f7b85d1 --- /dev/null +++ b/build-android.sh @@ -0,0 +1,66 @@ +#!/bin/bash + +set -e + +echo "=== RebelFork Android Build ===" + +if [ ! -f "CMakeLists.txt" ] || [ ! -d "android" ]; then + echo "Error: run from project root" + exit 1 +fi + +# Download SDK only if not already extracted +SDK_DIR="rebelfork-sdk-android-clang-arm64-dll-latest" +if [ ! -d "$SDK_DIR" ]; then + echo "Downloading SDK..." + rm -f rebelfork-sdk-android-clang-arm64-dll-latest.7z + if command -v wget >/dev/null 2>&1; then + wget -q https://github.com/rbfx/rbfx/releases/download/latest/rebelfork-sdk-android-clang-arm64-dll-latest.7z -O rebelfork-sdk-android.7z + elif command -v curl >/dev/null 2>&1; then + curl -sL https://github.com/rbfx/rbfx/releases/download/latest/rebelfork-sdk-android-clang-arm64-dll-latest.7z -o rebelfork-sdk-android.7z + else + echo "Error: wget or curl required" + exit 1 + fi + echo "Extracting SDK..." + 7z x rebelfork-sdk-android.7z -o. -y > /dev/null + rm -f rebelfork-sdk-android.7z +else + echo "SDK already present, skipping download" +fi + +# Add coredata (should this be part of the SDK?) +cp -r ../rbfx/bin/CoreData Project/ + +# Docker +if ! command -v docker >/dev/null 2>&1; then + echo "Error: docker not found" + exit 1 +fi + +# Build Docker image +echo "Building Docker image..." +docker build -t rbfx-android-builder-slim . + +# Submodules +if [ -f ".gitmodules" ]; then + git submodule sync + git submodule update --init --recursive +fi + +# Build +echo "Building..." +docker run --rm \ + -v "$PWD:/workspace" \ + -w /workspace \ + rbfx-android-builder-slim \ + bash -c " + set -e + cd android + gradle assembleDebug + chown -R $(id -u):$(id -g) /workspace + " + +# Report +echo "=== Result ===" +find android -name "*.apk" 2>/dev/null && echo "Build succeeded" || echo "No APK found"