From 1e1c8371cf2cf658f11a2a00960960930fc2b38a Mon Sep 17 00:00:00 2001 From: izzy2lost Date: Sun, 26 Oct 2025 06:57:49 -0400 Subject: [PATCH] Saves? --- .../src/public/libultra/os_eeprom.cpp | 25 ++++++++++- src/port/Engine.cpp | 45 +++++++++++++++++++ 2 files changed, 68 insertions(+), 2 deletions(-) diff --git a/libultraship/src/public/libultra/os_eeprom.cpp b/libultraship/src/public/libultra/os_eeprom.cpp index 3ba36bb0..46ea31c4 100644 --- a/libultraship/src/public/libultra/os_eeprom.cpp +++ b/libultraship/src/public/libultra/os_eeprom.cpp @@ -1,4 +1,23 @@ #include "libultraship/libultraship.h" +#include + +#ifdef __ANDROID__ +#include +extern "C" { + // Forward declare the JNI function to get save directory + const char* Android_GetSaveDir(); +} +#endif + +static std::string GetSaveFilePath() { +#ifdef __ANDROID__ + const char* saveDir = Android_GetSaveDir(); + if (saveDir != nullptr) { + return std::string(saveDir) + "/default.sav"; + } +#endif + return "default.sav"; +} extern "C" { @@ -10,7 +29,8 @@ int32_t osEepromLongRead(OSMesgQueue* mq, uint8_t address, uint8_t* buffer, int3 u8 content[512]; s32 ret = -1; - FILE* fp = fopen("default.sav", "rb"); + std::string savePath = GetSaveFilePath(); + FILE* fp = fopen(savePath.c_str(), "rb"); if (fp == NULL) { return -1; } @@ -34,7 +54,8 @@ int32_t osEepromLongWrite(OSMesgQueue* mq, uint8_t address, uint8_t* buffer, int } memcpy(content + address * 8, buffer, length); - FILE* fp = fopen("default.sav", "wb"); + std::string savePath = GetSaveFilePath(); + FILE* fp = fopen(savePath.c_str(), "wb"); if (fp == NULL) { return -1; } diff --git a/src/port/Engine.cpp b/src/port/Engine.cpp index 0167643b..7f2fe44d 100644 --- a/src/port/Engine.cpp +++ b/src/port/Engine.cpp @@ -913,6 +913,51 @@ extern "C" void GameEngine_Free(void* ptr) { #ifdef __ANDROID__ +#include + +static const char* sCachedSaveDir = nullptr; + +extern "C" const char* Android_GetSaveDir() { + if (sCachedSaveDir != nullptr) { + return sCachedSaveDir; + } + + JNIEnv* env = (JNIEnv*)SDL_AndroidGetJNIEnv(); + if (env == nullptr) { + return nullptr; + } + + jclass mainActivityClass = env->FindClass("com/starship/android/MainActivity"); + if (mainActivityClass == nullptr) { + return nullptr; + } + + jmethodID getSaveDirMethod = env->GetStaticMethodID(mainActivityClass, "getSaveDir", "()Ljava/lang/String;"); + if (getSaveDirMethod == nullptr) { + env->DeleteLocalRef(mainActivityClass); + return nullptr; + } + + jstring jSaveDir = (jstring)env->CallStaticObjectMethod(mainActivityClass, getSaveDirMethod); + if (jSaveDir == nullptr) { + env->DeleteLocalRef(mainActivityClass); + return nullptr; + } + + const char* saveDirCStr = env->GetStringUTFChars(jSaveDir, nullptr); + if (saveDirCStr != nullptr) { + // Cache the save directory path + static std::string cachedPath = saveDirCStr; + sCachedSaveDir = cachedPath.c_str(); + env->ReleaseStringUTFChars(jSaveDir, saveDirCStr); + } + + env->DeleteLocalRef(jSaveDir); + env->DeleteLocalRef(mainActivityClass); + + return sCachedSaveDir; +} + extern "C" JNIEXPORT void JNICALL Java_com_starship_android_MainActivity_nativeSetAppDirs(JNIEnv* env, jclass, jstring jpath) { // No-op: paths resolved via SDL_AndroidGetInternalStoragePath in GameEngine::GameEngine()