Maelstrom: Added Android build of Maelstrom

From df99edf3ca3aca13b53844bd3679e6e639dd14ad Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Sat, 21 Mar 2026 15:55:22 -0700
Subject: [PATCH] Added Android build of Maelstrom

---
 CMakeLists.txt                                |  58 ++++++++++--------
 Data/Icons/icon-144.png                       | Bin 0 -> 3481 bytes
 TODO                                          |   1 -
 android-project/app/build.gradle              |   7 ++-
 .../app/src/main/AndroidManifest.xml          |   6 +-
 .../java/org/libsdl/Maelstrom/Maelstrom.java  |   9 +++
 .../src/main/res/mipmap-hdpi/ic_launcher.png  | Bin 2683 -> 3745 bytes
 .../src/main/res/mipmap-mdpi/ic_launcher.png  | Bin 1698 -> 2386 bytes
 .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 3872 -> 5293 bytes
 .../main/res/mipmap-xxhdpi/ic_launcher.png    | Bin 6874 -> 3481 bytes
 .../main/res/mipmap-xxxhdpi/ic_launcher.png   | Bin 14526 -> 3267 bytes
 .../app/src/main/res/values/strings.xml       |   2 +-
 12 files changed, 49 insertions(+), 34 deletions(-)
 create mode 100644 Data/Icons/icon-144.png
 create mode 100644 android-project/app/src/main/java/org/libsdl/Maelstrom/Maelstrom.java

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 995bdfac..2fa92b61 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.25...4.0)
+cmake_minimum_required(VERSION 3.0...4.0)
 
 set(MAJOR_VERSION 4)
 set(MINOR_VERSION 0)
@@ -21,11 +21,11 @@ endif()
 
 add_subdirectory(maclib)
 add_subdirectory(external/SDL EXCLUDE_FROM_ALL)
-block()
-    # SDL_net's ABI has not yet been finalized
-    set(BUILD_SHARED_LIBS OFF)
-    add_subdirectory(external/SDL_net EXCLUDE_FROM_ALL)
-endblock()
+# SDL_net's ABI has not yet been finalized
+set(original_BUILD_SHARED_LIBS "${BUILD_SHARED_LIBS}")
+set(BUILD_SHARED_LIBS OFF)
+add_subdirectory(external/SDL_net SDL_net EXCLUDE_FROM_ALL)
+set(BUILD_SHARED_LIBS "${original_BUILD_SHARED_LIBS}")
 
 SDL_DetectTargetCPUArchitectures(SDL_CPU_NAMES)
 SDL_DetectCMakePlatform()
@@ -143,17 +143,23 @@ set(MAELSTROM_SOURCES
 	Maelstrom.rc
 )
 
-add_executable(Maelstrom WIN32 ${MAELSTROM_SOURCES})
+if(ANDROID)
+    set(TARGET_NAME main)
+    add_library(${TARGET_NAME} MODULE ${MAELSTROM_SOURCES})
+else()
+    set(TARGET_NAME Maelstrom)
+    add_executable(${TARGET_NAME} WIN32 ${MAELSTROM_SOURCES})
+endif()
 
 if(MSVC)
-    target_compile_options(Maelstrom PRIVATE -W3)
+    target_compile_options(${TARGET_NAME} PRIVATE -W3)
 else()
-    target_compile_options(Maelstrom PRIVATE -Wall)
-    target_compile_options(Maelstrom PRIVATE -Wextra)
-    target_compile_options(Maelstrom PRIVATE -Wno-cast-function-type)
-    target_compile_options(Maelstrom PRIVATE -Wno-sign-compare)
-    target_compile_options(Maelstrom PRIVATE -Wno-unused-function)
-    target_compile_options(Maelstrom PRIVATE -Wno-unused-parameter)
+    target_compile_options(${TARGET_NAME} PRIVATE -Wall)
+    target_compile_options(${TARGET_NAME} PRIVATE -Wextra)
+    target_compile_options(${TARGET_NAME} PRIVATE -Wno-cast-function-type)
+    target_compile_options(${TARGET_NAME} PRIVATE -Wno-sign-compare)
+    target_compile_options(${TARGET_NAME} PRIVATE -Wno-unused-function)
+    target_compile_options(${TARGET_NAME} PRIVATE -Wno-unused-parameter)
 endif()
 
 if(NOT WIN32)
@@ -166,14 +172,14 @@ if(NOT WIN32)
       }
     " HAVE_GETIFADDRS)
   if(HAVE_GETIFADDRS)
-    target_compile_definitions(Maelstrom PRIVATE HAVE_GETIFADDRS)
+    target_compile_definitions(${TARGET_NAME} PRIVATE HAVE_GETIFADDRS)
   endif()
 endif()
 
 dep_option(STEAM "Build with Steam support" ON "WIN32 OR LINUX OR MACOS" OFF)
 
 if(STEAM)
-    target_compile_definitions(Maelstrom PRIVATE ENABLE_STEAM)
+    target_compile_definitions(${TARGET_NAME} PRIVATE ENABLE_STEAM)
     add_library(SteamworksSDK::steam_api SHARED IMPORTED)
     set_property(TARGET SteamworksSDK::steam_api PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${PROJECT_SOURCE_DIR}/external/SteamworksSDK/public")
     if(WIN32)
@@ -188,20 +194,20 @@ if(STEAM)
     elseif(MACOS)
         set_property(TARGET SteamworksSDK::steam_api PROPERTY IMPORTED_LOCATION "${PROJECT_SOURCE_DIR}/external/SteamworksSDK/redistributable_bin/osx/libsteam_api.dylib")
     endif()
-    target_link_libraries(Maelstrom PRIVATE SteamworksSDK::steam_api)
+    target_link_libraries(${TARGET_NAME} PRIVATE SteamworksSDK::steam_api)
 endif()
 
-target_link_libraries(Maelstrom PRIVATE SDLmac)
-target_link_libraries(Maelstrom PRIVATE SDL3::SDL3)
-target_link_libraries(Maelstrom PRIVATE SDL3_net::SDL3_net)
+target_link_libraries(${TARGET_NAME} PRIVATE SDLmac)
+target_link_libraries(${TARGET_NAME} PRIVATE SDL3_net::SDL3_net)
+target_link_libraries(${TARGET_NAME} PRIVATE SDL3::SDL3)
 
 if(EMSCRIPTEN)
     # Increase the default stack size
-    target_link_options(Maelstrom PRIVATE -sSTACK_SIZE=1048576 -lidbfs.js)
+    target_link_options(${TARGET_NAME} PRIVATE -sSTACK_SIZE=1048576 -lidbfs.js)
 
     # on the web, we have to put the files inside of the webassembly
     # somewhat unintuitively, this is done via a linker argument.
-    target_link_libraries(Maelstrom PRIVATE 
+    target_link_libraries(${TARGET_NAME} PRIVATE 
         "--preload-file \"${CMAKE_CURRENT_LIST_DIR}/Data@/\""
     )
 else()
@@ -213,18 +219,18 @@ else()
         set(CMAKE_INSTALL_DOCDIR "Docs")
         set(GAME_INSTALL_DATADIR ".")
         if(APPLE)
-            set_property(TARGET Maelstrom SDL3-shared PROPERTY INSTALL_RPATH "@executable_path")
+            set_property(TARGET ${TARGET_NAME} SDL3-shared PROPERTY INSTALL_RPATH "@executable_path")
         else()
-            set_property(TARGET Maelstrom SDL3-shared PROPERTY INSTALL_RPATH "$ORIGIN")
+            set_property(TARGET ${TARGET_NAME} SDL3-shared PROPERTY INSTALL_RPATH "$ORIGIN")
         endif()
     else()
         include(GNUInstallDirs)
         set(GAME_INSTALL_DATADIR "${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME}")
 
-        target_compile_definitions(Maelstrom PRIVATE MAELSTROM_DATA=\"${CMAKE_INSTALL_PREFIX}/${GAME_INSTALL_DATADIR}/Data/\")
+        target_compile_definitions(${TARGET_NAME} PRIVATE MAELSTROM_DATA=\"${CMAKE_INSTALL_PREFIX}/${GAME_INSTALL_DATADIR}/Data/\")
     endif()
 
-    install(TARGETS Maelstrom SDL3-shared LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" NAMELINK_SKIP RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
+    install(TARGETS ${TARGET_NAME} SDL3-shared LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" NAMELINK_SKIP RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
     if(STEAM)
         install(IMPORTED_RUNTIME_ARTIFACTS SteamworksSDK::steam_api)
     endif()
diff --git a/Data/Icons/icon-144.png b/Data/Icons/icon-144.png
new file mode 100644
index 0000000000000000000000000000000000000000..fa953e009a290dbe9c4d806399d8a4f3cba22732
GIT binary patch
literal 3481
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
D0O1FQ

literal 0
HcmV?d00001

diff --git a/TODO b/TODO
index 01a9c573..d50d1c90 100644
--- a/TODO
+++ b/TODO
@@ -1,4 +1,3 @@
 * Add Steam Remote Play touch control layout
-* Add Android build to GitHub actions
 * Add assets and entitlements for Apple Store
 * Update documentation
diff --git a/android-project/app/build.gradle b/android-project/app/build.gradle
index b9d75b14..2e286815 100644
--- a/android-project/app/build.gradle
+++ b/android-project/app/build.gradle
@@ -2,10 +2,10 @@ plugins {
      id 'com.android.application'
 }
 
-def buildWithCMake = project.hasProperty('BUILD_WITH_CMAKE');
+def buildWithCMake = true
 
 android {
-    namespace = "org.libsdl.app"
+    namespace = "org.libsdl.Maelstrom"
     compileSdkVersion 35
     ndkVersion = "28.2.13676358"
     defaultConfig {
@@ -39,11 +39,12 @@ android {
     if (!project.hasProperty('EXCLUDE_NATIVE_LIBS')) {
         sourceSets.main {
             jniLibs.srcDir 'libs'
+            assets.srcDir '../../Data'
         }
         externalNativeBuild {
             if (buildWithCMake) {
                 cmake {
-                    path 'jni/CMakeLists.txt'
+                    path '../../CMakeLists.txt'
                 }
             } else {
                 ndkBuild {
diff --git a/android-project/app/src/main/AndroidManifest.xml b/android-project/app/src/main/AndroidManifest.xml
index ab43f76a..12c05240 100644
--- a/android-project/app/src/main/AndroidManifest.xml
+++ b/android-project/app/src/main/AndroidManifest.xml
@@ -51,13 +51,13 @@
     <!-- <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> -->
 
     <!-- Allow access to the vibrator -->
+    <!--
     <uses-permission android:name="android.permission.VIBRATE" />
+    -->
 
     <!-- Allow access to Internet -->
     <!-- if you want to connect to the network or internet, uncomment this. -->
-    <!--
     <uses-permission android:name="android.permission.INTERNET" />
-    -->
 
     <!-- Create a Java class extending SDLActivity and place it in a
          directory under app/src/main/java matching the package, e.g. app/src/main/java/com/gamemaker/game/MyGame.java
@@ -78,7 +78,7 @@
         <meta-data android:name="SDL_ENV.SDL_ANDROID_TRAP_BACK_BUTTON" android:value="0"/>
          -->
 
-        <activity android:name="SDLActivity"
+        <activity android:name="Maelstrom"
             android:label="@string/app_name"
             android:alwaysRetainTaskState="true"
             android:launchMode="singleInstance"
diff --git a/android-project/app/src/main/java/org/libsdl/Maelstrom/Maelstrom.java b/android-project/app/src/main/java/org/libsdl/Maelstrom/Maelstrom.java
new file mode 100644
index 00000000..34fb4495
--- /dev/null
+++ b/android-project/app/src/main/java/org/libsdl/Maelstrom/Maelstrom.java
@@ -0,0 +1,9 @@
+package org.libsdl.Maelstrom;
+
+import org.libsdl.app.SDLActivity;
+
+/**
+ * A sample wrapper class that just calls SDLActivity
+ */
+
+public class Maelstrom extends SDLActivity { }
diff --git a/android-project/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android-project/app/src/main/res/mipmap-hdpi/ic_launcher.png
index d50bdaae06ee5a8d3f39911f81715abd3bf7b24d..5d3c70f46c15210a3bcd9ecb640bc406a451c4b2 100644
GIT binary patch
literal 3745
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
LNkvXXu0mjfXn%db

literal 2683
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

diff --git a/android-project/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android-project/app/src/main/res/mipmap-mdpi/ic_launcher.png
index 0a299eb3cc0273ad1fc260cf0b4a2c35f5d373f5..31de30ecac31d2bbed0d4c31f1d693b8896c9307 100644
GIT binary patch
literal 2386
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
Eg40CRDgXcg

delta 1693
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

diff --git a/android-project/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android-project/app/src/main/res/mipmap-xhdpi/ic_launcher.png
index a336ad5c2baca59928871a9133e88435f31b402d..06483172015c3313e7173bb543bed3e94097c4d9 100644
GIT binary patch
literal 5293
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

(Patch may be truncated, please check the link at the top of this post.)