diff --git a/Core/Config.h b/Core/Config.h index 090f058a9a..7b4d2e9fac 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -113,6 +113,7 @@ public: std::string currentDirectory; std::string memCardDirectory; std::string flashDirectory; + std::string internalDataDirectory; void Load(const char *iniFileName = "ppsspp.ini"); void Save(); diff --git a/Core/HW/atrac3plus.cpp b/Core/HW/atrac3plus.cpp index 4a15463401..8ee436a595 100644 --- a/Core/HW/atrac3plus.cpp +++ b/Core/HW/atrac3plus.cpp @@ -3,6 +3,9 @@ #else #include #include +#ifdef ANDROID +#include +#endif #endif // _WIN32 #include @@ -11,6 +14,7 @@ #include "base/logging.h" #include "Core/Config.h" +#include "Common/FileUtil.h" extern std::string externalDirectory; @@ -46,16 +50,29 @@ namespace Atrac3plus_Decoder { return -1; } #else - std::string filename = "at3plusdecoder.so"; #if defined(ANDROID) && defined(ARM) - + std::string sdFilename; + std::string internalFilename = g_Config.internalDataDirectory + "libat3plusdecoder.so"; #if ARMEABI_V7A - filename = g_Config.memCardDirectory + "PSP/libs/armeabi-v7a/lib" + filename; + sdFilename = g_Config.memCardDirectory + "PSP/libs/armeabi-v7a/libat3plusdecoder.so"; #else - filename = g_Config.memCardDirectory + "PSP/libs/armeabi/lib" + filename; + sdFilename = g_Config.memCardDirectory + "PSP/libs/armeabi/libat3plusdecoder.so"; #endif + // SD cards are often mounted no-exec. + if (!File::Exists(internalFilename)) { + if (!File::Copy(sdFilename, internalFilename)) { + ELOG("Failed to copy %s to %s", sdFilename.c_str(), internalFilename.c_str()); + return -1; + } + if (chmod(internalFilename.c_str(), 0777) < 0) { + ELOG("Failed to chmod %s, continuing anyway", internalFilename.c_str()); + } + } + std::string filename = internalFilename; +#else + std::string filename = "libat3plusdecoder.so"; #endif ILOG("Attempting to load atrac3plus decoder from %s", filename.c_str()); diff --git a/UI/NativeApp.cpp b/UI/NativeApp.cpp index 5dda8ee4a9..aeec4b5864 100644 --- a/UI/NativeApp.cpp +++ b/UI/NativeApp.cpp @@ -295,6 +295,7 @@ void NativeInit(int argc, const char *argv[], const char *savegame_directory, co } #if defined(ANDROID) + g_Config.internalDataDirectory = savegame_directory; // Maybe there should be an option to use internal memory instead, but I think // that for most people, using external memory (SDCard/USB Storage) makes the // most sense.