diff --git a/.gitignore b/.gitignore index fae9b07..9af9fbf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ -*~ -/out +out +android/.gradle +android/app/.externalNativeBuild +android/app/build +android/build diff --git a/CMakeLists.txt b/CMakeLists.txt index 8f51aa6..8f94f13 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,6 +39,12 @@ if (EMSCRIPTEN) set(SDL2_FOUND 1) set(FREETYPE_FOUND 1) set(DEFAULT_FONT_PATH .) +elseif (ANDROID) + set(SDL2_FOUND 1) + set(SDL2MIXER_FOUND 1) + set(SDL2TTF_FOUND 1) + set(DEFAULT_FONT_PATH .) + find_library(ndk_zlib z) else() include(TestBigEndian) TEST_BIG_ENDIAN(WORDS_BIGENDIAN) @@ -153,7 +159,7 @@ if (EMSCRIPTEN) list(APPEND SRC_MIDI midi.emscripten.c) list(APPEND SUMMARY_MIDI "Emscripten") else() - if (HAVE_SIGACTION) + if (HAVE_SIGACTION AND NOT ANDROID) list(APPEND SRC_MIDI midi.rawmidi.c midifile.c) list(APPEND SUMMARY_MIDI "raw") set(MIDI_DEVICE "/dev/midi" CACHE STRING "midi device") @@ -182,7 +188,7 @@ endif() # Joystick -if (EMSCRIPTEN) +if (EMSCRIPTEN OR ANDROID) set(SRC_JOYSTICK joystick_dmy.c) elseif (SDL2_FOUND) set(SRC_JOYSTICK joystick_sdl.c) diff --git a/android/app/build.gradle b/android/app/build.gradle index bf3c35d..e3a4368 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -18,15 +18,11 @@ android { versionCode 1 versionName "1.0" externalNativeBuild { - ndkBuild { - arguments "APP_PLATFORM=android-16" - abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' + cmake { + arguments "-DANDROID_APP_PLATFORM=android-16", "-DANDROID_STL=c++_static" + // abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' + abiFilters 'arm64-v8a' } - // cmake { - // arguments "-DANDROID_APP_PLATFORM=android-16", "-DANDROID_STL=c++_static" - // // abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' - // abiFilters 'arm64-v8a' - // } } } buildTypes { @@ -40,12 +36,12 @@ android { jniLibs.srcDir 'libs' } externalNativeBuild { - ndkBuild { - path 'jni/Android.mk' + cmake { + // xsystem35 requires CMake >=3.13, so SDK-bundled CMake + // (3.6 or 3.10.2) cannot be used. + version getInstalledCmakeVersion() + path 'jni/CMakeLists.txt' } - // cmake { - // path 'jni/CMakeLists.txt' - // } } } @@ -69,3 +65,7 @@ android { dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') } + +String getInstalledCmakeVersion() { + ('cmake --version'.execute().text =~ /cmake version ([0-9.]+)/)[0][1] +} diff --git a/android/app/jni/CMakeLists.txt b/android/app/jni/CMakeLists.txt index 3d49cf3..f59a81a 100644 --- a/android/app/jni/CMakeLists.txt +++ b/android/app/jni/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.6) +cmake_minimum_required(VERSION 3.13) project(GAME) @@ -6,15 +6,44 @@ project(GAME) # include(AndroidNdkModules) # android_ndk_import_module_cpufeatures() +include(FetchContent) +# TODO: Use SDL2 2.0.11 once released +FetchContent_Declare( + SDL + URL https://hg.libsdl.org/SDL/archive/a5f93b21dfe0.tar.gz # rev 13383 + URL_HASH SHA1=a7e9696f7ef8af7c4b89671b096c38d1a4cbf90c +) +# TODO: Use SDL2_ttf 2.0.16 once released +FetchContent_Declare( + SDL_ttf + URL https://hg.libsdl.org/SDL_ttf/archive/d56d67db41d8.tar.gz # rev 420 + URL_HASH SHA1=143089a2b2973a5baeee0914af43608cfe8e1d87 +) +# TODO: Use SDL2_mixer 2.0.5 once released +FetchContent_Declare( + SDL_mixer + URL https://hg.libsdl.org/SDL_mixer/archive/d2686bcfcba2.tar.gz # rev 1127 + URL_HASH SHA1=4e62e29bd5628b262b3ffb6d5d29861c76a1500e +) -# SDL sources are in a subfolder named "SDL" -add_subdirectory(SDL) - -# Compilation of companion libraries -#add_subdirectory(SDL_image) -#add_subdirectory(SDL_mixer) -#add_subdirectory(SDL_ttf) - -# Your game and its CMakeLists.txt are in a subfolder named "src" -add_subdirectory(src) +# Compilation of SDL and companion libraries +FetchContent_GetProperties(SDL) +if(NOT sdl_POPULATED) + FetchContent_Populate(SDL) + add_subdirectory(${sdl_SOURCE_DIR} ${sdl_BINARY_DIR}) +endif() +FetchContent_GetProperties(SDL_ttf) +if(NOT sdl_ttf_POPULATED) + FetchContent_Populate(SDL_ttf) + add_subdirectory(${sdl_ttf_SOURCE_DIR} ${sdl_ttf_BINARY_DIR}) +endif() +FetchContent_GetProperties(SDL_mixer) +if(NOT sdl_mixer_POPULATED) + FetchContent_Populate(SDL_mixer) + add_subdirectory(${sdl_mixer_SOURCE_DIR} ${sdl_mixer_BINARY_DIR}) + # TODO: Fix this in upstream + target_include_directories(SDL2_mixer PUBLIC ${sdl_mixer_SOURCE_DIR}/include) +endif() +# The main CMakeLists.txt of xsystem35 +add_subdirectory(../../.. xsystem35) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 830acd4..096fc0a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -7,7 +7,11 @@ if (ENABLE_MODULES) endif() endif() -add_executable(xsystem35) +if (ANDROID) + add_library(xsystem35 SHARED) +else() + add_executable(xsystem35) +endif() target_compile_options(xsystem35 PRIVATE -Wno-pointer-sign -Wno-invalid-source-encoding) @@ -79,7 +83,11 @@ if (EMSCRIPTEN) "SHELL:-s EXPORTED_FUNCTIONS=\"['_main','_ags_setAntialiasedStringMode', '_ald_getdata', '_ald_freedata']\"" "SHELL:-s EXTRA_EXPORTED_RUNTIME_METHODS=\"['getValue','getMemory','addRunDependency','removeRunDependency']\"") -else() # non-emscripten +elseif (ANDROID) + + target_link_libraries(xsystem35 PRIVATE SDL2 SDL2_ttf SDL2_mixer ${ndk_zlib}) + +else() # non-emscripten, non-android target_link_libraries(xsystem35 PRIVATE m ZLIB::ZLIB) if (X11_FOUND) target_include_directories(xsystem35 PRIVATE ${X11_INCLUDE_DIR}) @@ -108,7 +116,7 @@ else() # non-emscripten endif() # FIXME: set up dependency for xsystem35 on this -if (ENABLE_SDL AND NOT EMSCRIPTEN) +if (ENABLE_SDL AND NOT EMSCRIPTEN AND NOT ANDROID) add_custom_target(sdl_input.c COMMAND perl xsyskey.pl ${SDL2_INCLUDE_DIRS} > sdl_input.c WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/src/xsystem35.c b/src/xsystem35.c index 3ad7cf0..9fcf2df 100644 --- a/src/xsystem35.c +++ b/src/xsystem35.c @@ -41,6 +41,10 @@ # include #endif +#ifdef ENABLE_SDL +# include +#endif + #ifdef __EMSCRIPTEN__ #include #endif