diff --git a/CMakeLists.txt b/CMakeLists.txt
index a508ed2eeb..c172945d67 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -502,6 +502,8 @@ add_library(Common STATIC
Common/File/VFS/VFS.cpp
Common/File/VFS/AssetReader.cpp
Common/File/VFS/AssetReader.h
+ Common/File/AndroidStorage.h
+ Common/File/AndroidStorage.cpp
Common/File/DiskFree.h
Common/File/DiskFree.cpp
Common/File/Path.h
diff --git a/Common/Common.vcxproj b/Common/Common.vcxproj
index 08f36d1574..18aa24af53 100644
--- a/Common/Common.vcxproj
+++ b/Common/Common.vcxproj
@@ -409,6 +409,7 @@
+
@@ -831,6 +832,7 @@
+
diff --git a/Common/Common.vcxproj.filters b/Common/Common.vcxproj.filters
index bf90f1efc2..7f015889fc 100644
--- a/Common/Common.vcxproj.filters
+++ b/Common/Common.vcxproj.filters
@@ -395,6 +395,9 @@
File
+
+ File
+
@@ -762,6 +765,9 @@
File
+
+ File
+
@@ -877,4 +883,4 @@
Math\fast
-
\ No newline at end of file
+
diff --git a/Common/File/AndroidStorage.cpp b/Common/File/AndroidStorage.cpp
new file mode 100644
index 0000000000..5112fee7e9
--- /dev/null
+++ b/Common/File/AndroidStorage.cpp
@@ -0,0 +1,190 @@
+#include "Common/File/AndroidStorage.h"
+#include "Common/StringUtils.h"
+#include "Common/Log.h"
+#include "Common/TimeUtil.h"
+
+#include "android/jni/app-android.h"
+
+#if PPSSPP_PLATFORM(ANDROID) && !defined(__LIBRETRO__)
+
+static jmethodID openContentUri;
+static jmethodID listContentUriDir;
+static jmethodID contentUriCreateFile;
+static jmethodID contentUriCreateDirectory;
+static jmethodID contentUriRemoveFile;
+static jmethodID contentUriGetFileInfo;
+static jmethodID contentUriGetFreeStorageSpace;
+static jmethodID filePathGetFreeStorageSpace;
+
+static jobject g_nativeActivity;
+
+void Android_StorageSetNativeActivity(jobject nativeActivity) {
+ g_nativeActivity = nativeActivity;
+}
+
+void Android_RegisterStorageCallbacks(JNIEnv * env, jobject obj) {
+ openContentUri = env->GetMethodID(env->GetObjectClass(obj), "openContentUri", "(Ljava/lang/String;Ljava/lang/String;)I");
+ _dbg_assert_(openContentUri);
+ listContentUriDir = env->GetMethodID(env->GetObjectClass(obj), "listContentUriDir", "(Ljava/lang/String;)[Ljava/lang/String;");
+ _dbg_assert_(listContentUriDir);
+ contentUriCreateDirectory = env->GetMethodID(env->GetObjectClass(obj), "contentUriCreateDirectory", "(Ljava/lang/String;Ljava/lang/String;)Z");
+ _dbg_assert_(contentUriCreateDirectory);
+ contentUriCreateFile = env->GetMethodID(env->GetObjectClass(obj), "contentUriCreateFile", "(Ljava/lang/String;Ljava/lang/String;)Z");
+ _dbg_assert_(contentUriCreateFile);
+ contentUriRemoveFile = env->GetMethodID(env->GetObjectClass(obj), "contentUriRemoveFile", "(Ljava/lang/String;)Z");
+ _dbg_assert_(contentUriRemoveFile);
+ contentUriGetFileInfo = env->GetMethodID(env->GetObjectClass(obj), "contentUriGetFileInfo", "(Ljava/lang/String;)Ljava/lang/String;");
+ _dbg_assert_(contentUriGetFileInfo);
+ contentUriGetFreeStorageSpace = env->GetMethodID(env->GetObjectClass(obj), "contentUriGetFreeStorageSpace", "(Ljava/lang/String;)J");
+ _dbg_assert_(contentUriGetFreeStorageSpace);
+ filePathGetFreeStorageSpace = env->GetMethodID(env->GetObjectClass(obj), "filePathGetFreeStorageSpace", "(Ljava/lang/String;)J");
+ _dbg_assert_(filePathGetFreeStorageSpace);
+}
+
+bool Android_IsContentUri(const std::string &filename) {
+ return startsWith(filename, "content://");
+}
+
+int Android_OpenContentUriFd(const std::string &filename, Android_OpenContentUriMode mode) {
+ if (!g_nativeActivity) {
+ return -1;
+ }
+
+ std::string fname = filename;
+ // PPSSPP adds an ending slash to directories before looking them up.
+ // TODO: Fix that in the caller (or don't call this for directories).
+ if (fname.back() == '/')
+ fname.pop_back();
+
+ auto env = getEnv();
+ const char *modeStr = "";
+ switch (mode) {
+ case Android_OpenContentUriMode::READ: modeStr = "r"; break;
+ case Android_OpenContentUriMode::READ_WRITE: modeStr = "rw"; break;
+ case Android_OpenContentUriMode::READ_WRITE_TRUNCATE: modeStr = "rwt"; break;
+ }
+ jstring j_filename = env->NewStringUTF(fname.c_str());
+ jstring j_mode = env->NewStringUTF(modeStr);
+ int fd = env->CallIntMethod(g_nativeActivity, openContentUri, j_filename, j_mode);
+ return fd;
+}
+
+bool Android_CreateDirectory(const std::string &rootTreeUri, const std::string &dirName) {
+ if (!g_nativeActivity) {
+ return false;
+ }
+ auto env = getEnv();
+ jstring paramRoot = env->NewStringUTF(rootTreeUri.c_str());
+ jstring paramDirName = env->NewStringUTF(dirName.c_str());
+ return env->CallBooleanMethod(g_nativeActivity, contentUriCreateDirectory, paramRoot, paramDirName);
+}
+
+bool Android_CreateFile(const std::string &parentTreeUri, const std::string &fileName) {
+ if (!g_nativeActivity) {
+ return false;
+ }
+ auto env = getEnv();
+ jstring paramRoot = env->NewStringUTF(parentTreeUri.c_str());
+ jstring paramFileName = env->NewStringUTF(fileName.c_str());
+ return env->CallBooleanMethod(g_nativeActivity, contentUriCreateFile, paramRoot, paramFileName);
+}
+
+bool Android_RemoveFile(const std::string &fileUri) {
+ if (!g_nativeActivity) {
+ return false;
+ }
+ auto env = getEnv();
+ jstring paramFileName = env->NewStringUTF(fileUri.c_str());
+ return env->CallBooleanMethod(g_nativeActivity, contentUriRemoveFile, paramFileName);
+}
+
+static bool ParseFileInfo(const std::string &line, File::FileInfo *fileInfo) {
+ INFO_LOG(FILESYS, "!! %s", line.c_str());
+ std::vector parts;
+ SplitString(line, '|', parts);
+ if (parts.size() != 5) {
+ ERROR_LOG(FILESYS, "Bad format: %s", line.c_str());
+ return false;
+ }
+ fileInfo->name = std::string(parts[2]);
+ fileInfo->isDirectory = parts[0][0] == 'D';
+ fileInfo->exists = true;
+ sscanf(parts[1].c_str(), "%ld", &fileInfo->size);
+ fileInfo->fullName = Path(parts[3]);
+ fileInfo->isWritable = false; // TODO: We don't yet request write access
+ sscanf(parts[4].c_str(), "%ld", &fileInfo->lastModified);
+ return true;
+}
+
+bool Android_GetFileInfo(const std::string &fileUri, File::FileInfo *fileInfo) {
+ if (!g_nativeActivity) {
+ return false;
+ }
+ auto env = getEnv();
+ jstring paramFileUri = env->NewStringUTF(fileUri.c_str());
+
+ jstring str = (jstring)env->CallObjectMethod(g_nativeActivity, contentUriGetFileInfo, paramFileUri);
+ if (!str) {
+ return false;
+ }
+ const char *charArray = env->GetStringUTFChars(str, 0);
+ bool retval = ParseFileInfo(std::string(charArray), fileInfo);
+ env->DeleteLocalRef(str);
+ return retval && fileInfo->exists;
+}
+
+std::vector Android_ListContentUri(const std::string &path) {
+ if (!g_nativeActivity) {
+ return std::vector();
+ }
+ auto env = getEnv();
+
+ double start = time_now_d();
+
+ jstring param = env->NewStringUTF(path.c_str());
+ jobject retval = env->CallObjectMethod(g_nativeActivity, listContentUriDir, param);
+
+ jobjectArray fileList = (jobjectArray)retval;
+ std::vector items;
+ int size = env->GetArrayLength(fileList);
+ for (int i = 0; i < size; i++) {
+ jstring str = (jstring)env->GetObjectArrayElement(fileList, i);
+ const char *charArray = env->GetStringUTFChars(str, 0);
+ if (charArray) { // paranoia
+ std::string file = charArray;
+ File::FileInfo info;
+ if (ParseFileInfo(file, &info)) {
+ items.push_back(info);
+ }
+ }
+ env->ReleaseStringUTFChars(str, charArray);
+ env->DeleteLocalRef(str);
+ }
+ env->DeleteLocalRef(fileList);
+
+ double elapsed = time_now_d() - start;
+ INFO_LOG(FILESYS, "Listing directory on content URI took %0.3f s", elapsed);
+ return items;
+}
+
+int64_t Android_GetFreeSpaceByContentUri(const std::string &uri) {
+ if (!g_nativeActivity) {
+ return false;
+ }
+ auto env = getEnv();
+
+ jstring param = env->NewStringUTF(uri.c_str());
+ return env->CallLongMethod(g_nativeActivity, contentUriGetFreeStorageSpace, param);
+}
+
+int64_t Android_GetFreeSpaceByFilePath(const std::string &filePath) {
+ if (!g_nativeActivity) {
+ return false;
+ }
+ auto env = getEnv();
+
+ jstring param = env->NewStringUTF(filePath.c_str());
+ return env->CallLongMethod(g_nativeActivity, filePathGetFreeStorageSpace, param);
+}
+
+#endif
diff --git a/Common/File/AndroidStorage.h b/Common/File/AndroidStorage.h
new file mode 100644
index 0000000000..71211824df
--- /dev/null
+++ b/Common/File/AndroidStorage.h
@@ -0,0 +1,53 @@
+#pragma once
+
+#include
+#include
+
+#include "Common/File/DirListing.h"
+
+// To emphasize that Android storage mode strings are different, let's just use
+// an enum.
+enum class Android_OpenContentUriMode {
+ READ = 0, // "r"
+ READ_WRITE = 1, // "rw"
+ READ_WRITE_TRUNCATE = 2, // "rwt"
+};
+
+#if PPSSPP_PLATFORM(ANDROID) && !defined(__LIBRETRO__)
+
+#include
+
+extern std::string g_extFilesDir;
+
+void Android_StorageSetNativeActivity(jobject nativeActivity);
+
+bool Android_IsContentUri(const std::string &uri);
+int Android_OpenContentUriFd(const std::string &uri, const Android_OpenContentUriMode mode);
+bool Android_CreateDirectory(const std::string &parentTreeUri, const std::string &dirName);
+bool Android_CreateFile(const std::string &parentTreeUri, const std::string &fileName);
+bool Android_RemoveFile(const std::string &fileUri);
+bool Android_GetFileInfo(const std::string &fileUri, File::FileInfo *info);
+int64_t Android_GetFreeSpaceByContentUri(const std::string &uri);
+int64_t Android_GetFreeSpaceByFilePath(const std::string &filePath);
+
+std::vector Android_ListContentUri(const std::string &uri);
+
+void Android_RegisterStorageCallbacks(JNIEnv * env, jobject obj);
+
+#else
+
+// Stub out the Android Storage wrappers, so that we can avoid ifdefs everywhere.
+
+inline bool Android_IsContentUri(const std::string &uri) { return false; }
+inline int Android_OpenContentUriFd(const std::string &uri, const Android_OpenContentUriMode mode) { return -1; }
+inline bool Android_CreateDirectory(const std::string &parentTreeUri, const std::string &dirName) { return false; }
+inline bool Android_CreateFile(const std::string &parentTreeUri, const std::string &fileName) { return false; }
+inline bool Android_RemoveFile(const std::string &fileUri) { return false; }
+inline bool Android_GetFileInfo(const std::string &fileUri, File::FileInfo *info) { return false; }
+inline int64_t Android_GetFreeSpaceByContentUri(const std::string &uri) { return -1; }
+inline int64_t Android_GetFreeSpaceByFilePath(const std::string &filePath) { return -1; }
+inline std::vector Android_ListContentUri(const std::string &uri) {
+ return std::vector();
+}
+
+#endif
diff --git a/Common/File/DirListing.cpp b/Common/File/DirListing.cpp
index 86c46366d1..4988f7784e 100644
--- a/Common/File/DirListing.cpp
+++ b/Common/File/DirListing.cpp
@@ -23,7 +23,7 @@
#include "Common/Net/URL.h"
#include "Common/File/DirListing.h"
#include "Common/File/FileUtil.h"
-#include "android/jni/app-android.h"
+#include "Common/File/AndroidStorage.h"
#if !defined(__linux__) && !defined(_WIN32) && !defined(__QNX__)
#define stat64 stat
diff --git a/android/jni/Android.mk b/android/jni/Android.mk
index bb41dabcd3..be6c4dda3c 100644
--- a/android/jni/Android.mk
+++ b/android/jni/Android.mk
@@ -249,6 +249,7 @@ EXEC_AND_LIB_FILES := \
$(SRC)/Common/Data/Text/I18n.cpp \
$(SRC)/Common/Data/Text/Parsers.cpp \
$(SRC)/Common/Data/Text/WrapText.cpp \
+ $(SRC)/Common/File/AndroidStorage.cpp \
$(SRC)/Common/File/VFS/VFS.cpp \
$(SRC)/Common/File/VFS/AssetReader.cpp \
$(SRC)/Common/File/DiskFree.cpp \
diff --git a/android/jni/app-android.cpp b/android/jni/app-android.cpp
index 76fbfba0d5..04595475bf 100644
--- a/android/jni/app-android.cpp
+++ b/android/jni/app-android.cpp
@@ -64,6 +64,7 @@ struct JNIEnv {};
#include "Common/File/DirListing.h"
#include "Common/File/VFS/VFS.h"
#include "Common/File/VFS/AssetReader.h"
+#include "Common/File/AndroidStorage.h"
#include "Common/Input/InputState.h"
#include "Common/Input/KeyCodes.h"
#include "Common/Profiler/Profiler.h"
@@ -172,15 +173,6 @@ static float g_safeInsetBottom = 0.0;
static jmethodID postCommand;
-static jmethodID openContentUri;
-static jmethodID listContentUriDir;
-static jmethodID contentUriCreateFile;
-static jmethodID contentUriCreateDirectory;
-static jmethodID contentUriRemoveFile;
-static jmethodID contentUriGetFileInfo;
-static jmethodID contentUriGetFreeStorageSpace;
-static jmethodID filePathGetFreeStorageSpace;
-
static jobject nativeActivity;
static volatile bool exitRenderLoop;
static bool renderLoopRunning;
@@ -240,152 +232,6 @@ void AndroidLogger::Log(const LogMessage &message) {
}
}
-bool Android_IsContentUri(const std::string &filename) {
- return startsWith(filename, "content://");
-}
-
-int Android_OpenContentUriFd(const std::string &filename, Android_OpenContentUriMode mode) {
- if (!nativeActivity) {
- return -1;
- }
-
- std::string fname = filename;
- // PPSSPP adds an ending slash to directories before looking them up.
- // TODO: Fix that in the caller (or don't call this for directories).
- if (fname.back() == '/')
- fname.pop_back();
-
- auto env = getEnv();
- const char *modeStr = "";
- switch (mode) {
- case Android_OpenContentUriMode::READ: modeStr = "r"; break;
- case Android_OpenContentUriMode::READ_WRITE: modeStr = "rw"; break;
- case Android_OpenContentUriMode::READ_WRITE_TRUNCATE: modeStr = "rwt"; break;
- }
- jstring j_filename = env->NewStringUTF(fname.c_str());
- jstring j_mode = env->NewStringUTF(modeStr);
- int fd = env->CallIntMethod(nativeActivity, openContentUri, j_filename, j_mode);
- return fd;
-}
-
-bool Android_CreateDirectory(const std::string &rootTreeUri, const std::string &dirName) {
- if (!nativeActivity) {
- return false;
- }
- auto env = getEnv();
- jstring paramRoot = env->NewStringUTF(rootTreeUri.c_str());
- jstring paramDirName = env->NewStringUTF(dirName.c_str());
- return env->CallBooleanMethod(nativeActivity, contentUriCreateDirectory, paramRoot, paramDirName);
-}
-
-bool Android_CreateFile(const std::string &parentTreeUri, const std::string &fileName) {
- if (!nativeActivity) {
- return false;
- }
- auto env = getEnv();
- jstring paramRoot = env->NewStringUTF(parentTreeUri.c_str());
- jstring paramFileName = env->NewStringUTF(fileName.c_str());
- return env->CallBooleanMethod(nativeActivity, contentUriCreateFile, paramRoot, paramFileName);
-}
-
-bool Android_RemoveFile(const std::string &fileUri) {
- if (!nativeActivity) {
- return false;
- }
- auto env = getEnv();
- jstring paramFileName = env->NewStringUTF(fileUri.c_str());
- return env->CallBooleanMethod(nativeActivity, contentUriRemoveFile, paramFileName);
-}
-
-static bool ParseFileInfo(const std::string &line, File::FileInfo *fileInfo) {
- INFO_LOG(FILESYS, "!! %s", line.c_str());
- std::vector parts;
- SplitString(line, '|', parts);
- if (parts.size() != 5) {
- ERROR_LOG(FILESYS, "Bad format: %s", line.c_str());
- return false;
- }
- fileInfo->name = std::string(parts[2]);
- fileInfo->isDirectory = parts[0][0] == 'D';
- fileInfo->exists = true;
- sscanf(parts[1].c_str(), "%ld", &fileInfo->size);
- fileInfo->fullName = Path(parts[3]);
- fileInfo->isWritable = false; // TODO: We don't yet request write access
- sscanf(parts[4].c_str(), "%ld", &fileInfo->lastModified);
- return true;
-}
-
-bool Android_GetFileInfo(const std::string &fileUri, File::FileInfo *fileInfo) {
- if (!nativeActivity) {
- return false;
- }
- auto env = getEnv();
- jstring paramFileUri = env->NewStringUTF(fileUri.c_str());
-
- jstring str = (jstring)env->CallObjectMethod(nativeActivity, contentUriGetFileInfo, paramFileUri);
- if (!str) {
- return false;
- }
- const char *charArray = env->GetStringUTFChars(str, 0);
- bool retval = ParseFileInfo(std::string(charArray), fileInfo);
- env->DeleteLocalRef(str);
- return retval && fileInfo->exists;
-}
-
-std::vector Android_ListContentUri(const std::string &path) {
- if (!nativeActivity) {
- return std::vector();
- }
- auto env = getEnv();
-
- double start = time_now_d();
-
- jstring param = env->NewStringUTF(path.c_str());
- jobject retval = env->CallObjectMethod(nativeActivity, listContentUriDir, param);
-
- jobjectArray fileList = (jobjectArray)retval;
- std::vector items;
- int size = env->GetArrayLength(fileList);
- for (int i = 0; i < size; i++) {
- jstring str = (jstring) env->GetObjectArrayElement(fileList, i);
- const char *charArray = env->GetStringUTFChars(str, 0);
- if (charArray) { // paranoia
- std::string file = charArray;
- File::FileInfo info;
- if (ParseFileInfo(file, &info)) {
- items.push_back(info);
- }
- }
- env->ReleaseStringUTFChars(str, charArray);
- env->DeleteLocalRef(str);
- }
- env->DeleteLocalRef(fileList);
-
- double elapsed = time_now_d() - start;
- INFO_LOG(FILESYS, "Listing directory on content URI took %0.3f s");
- return items;
-}
-
-int64_t Android_GetFreeSpaceByContentUri(const std::string &uri) {
- if (!nativeActivity) {
- return false;
- }
- auto env = getEnv();
-
- jstring param = env->NewStringUTF(uri.c_str());
- return env->CallLongMethod(nativeActivity, contentUriGetFreeStorageSpace, param);
-}
-
-int64_t Android_GetFreeSpaceByFilePath(const std::string &filePath) {
- if (!nativeActivity) {
- return false;
- }
- auto env = getEnv();
-
- jstring param = env->NewStringUTF(filePath.c_str());
- return env->CallLongMethod(nativeActivity, filePathGetFreeStorageSpace, param);
-}
-
JNIEnv* getEnv() {
JNIEnv *env;
int status = gJvm->GetEnv((void**)&env, JNI_VERSION_1_6);
@@ -633,25 +479,12 @@ extern "C" void Java_org_ppsspp_ppsspp_NativeActivity_registerCallbacks(JNIEnv *
postCommand = env->GetMethodID(env->GetObjectClass(obj), "postCommand", "(Ljava/lang/String;Ljava/lang/String;)V");
_dbg_assert_(postCommand);
- openContentUri = env->GetMethodID(env->GetObjectClass(obj), "openContentUri", "(Ljava/lang/String;Ljava/lang/String;)I");
- _dbg_assert_(openContentUri);
- listContentUriDir = env->GetMethodID(env->GetObjectClass(obj), "listContentUriDir", "(Ljava/lang/String;)[Ljava/lang/String;");
- _dbg_assert_(listContentUriDir);
- contentUriCreateDirectory = env->GetMethodID(env->GetObjectClass(obj), "contentUriCreateDirectory", "(Ljava/lang/String;Ljava/lang/String;)Z");
- _dbg_assert_(contentUriCreateDirectory);
- contentUriCreateFile = env->GetMethodID(env->GetObjectClass(obj), "contentUriCreateFile", "(Ljava/lang/String;Ljava/lang/String;)Z");
- _dbg_assert_(contentUriCreateFile);
- contentUriRemoveFile = env->GetMethodID(env->GetObjectClass(obj), "contentUriRemoveFile", "(Ljava/lang/String;)Z");
- _dbg_assert_(contentUriRemoveFile);
- contentUriGetFileInfo = env->GetMethodID(env->GetObjectClass(obj), "contentUriGetFileInfo", "(Ljava/lang/String;)Ljava/lang/String;");
- _dbg_assert_(contentUriGetFileInfo);
- contentUriGetFreeStorageSpace = env->GetMethodID(env->GetObjectClass(obj), "contentUriGetFreeStorageSpace", "(Ljava/lang/String;)J");
- _dbg_assert_(contentUriGetFreeStorageSpace);
- filePathGetFreeStorageSpace = env->GetMethodID(env->GetObjectClass(obj), "filePathGetFreeStorageSpace", "(Ljava/lang/String;)J");
- _dbg_assert_(filePathGetFreeStorageSpace);
+ Android_RegisterStorageCallbacks(env, obj);
+ Android_StorageSetNativeActivity(nativeActivity);
}
extern "C" void Java_org_ppsspp_ppsspp_NativeActivity_unregisterCallbacks(JNIEnv *env, jobject obj) {
+ Android_StorageSetNativeActivity(nullptr);
env->DeleteGlobalRef(nativeActivity);
nativeActivity = nullptr;
}
diff --git a/android/jni/app-android.h b/android/jni/app-android.h
index 1486852778..d4cb8d2fee 100644
--- a/android/jni/app-android.h
+++ b/android/jni/app-android.h
@@ -9,14 +9,7 @@
#include "Common/LogManager.h"
#include "Common/File/DirListing.h"
#include "Common/File/Path.h"
-
-// To emphasize that Android storage mode strings are different, let's just use
-// an enum.
-enum class Android_OpenContentUriMode {
- READ = 0, // "r"
- READ_WRITE = 1, // "rw"
- READ_WRITE_TRUNCATE = 2, // "rwt"
-};
+#include "Common/File/AndroidStorage.h"
#if PPSSPP_PLATFORM(ANDROID) && !defined(__LIBRETRO__)
@@ -30,35 +23,4 @@ public:
void Log(const LogMessage &message) override;
};
-extern std::string g_extFilesDir;
-
-// Called from PathBrowser for example.
-
-bool Android_IsContentUri(const std::string &uri);
-int Android_OpenContentUriFd(const std::string &uri, const Android_OpenContentUriMode mode);
-bool Android_CreateDirectory(const std::string &parentTreeUri, const std::string &dirName);
-bool Android_CreateFile(const std::string &parentTreeUri, const std::string &fileName);
-bool Android_RemoveFile(const std::string &fileUri);
-bool Android_GetFileInfo(const std::string &fileUri, File::FileInfo *info);
-int64_t Android_GetFreeSpaceByContentUri(const std::string &uri);
-int64_t Android_GetFreeSpaceByFilePath(const std::string &filePath);
-
-std::vector Android_ListContentUri(const std::string &uri);
-
-#else
-
-// Stub out the Android Storage wrappers, so that we can avoid ifdefs everywhere.
-
-inline bool Android_IsContentUri(const std::string &uri) { return false; }
-inline int Android_OpenContentUriFd(const std::string &uri, const Android_OpenContentUriMode mode) { return -1; }
-inline bool Android_CreateDirectory(const std::string &parentTreeUri, const std::string &dirName) { return false; }
-inline bool Android_CreateFile(const std::string &parentTreeUri, const std::string &fileName) { return false; }
-inline bool Android_RemoveFile(const std::string &fileUri) { return false; }
-inline bool Android_GetFileInfo(const std::string &fileUri, File::FileInfo *info) { return false; }
-inline int64_t Android_GetFreeSpaceByContentUri(const std::string &uri) { return -1; }
-inline int64_t Android_GetFreeSpaceByFilePath(const std::string &filePath) { return -1; }
-inline std::vector Android_ListContentUri(const std::string &uri) {
- return std::vector();
-}
-
#endif
diff --git a/libretro/Makefile.common b/libretro/Makefile.common
index f9d8df5bb3..13ed66bdb5 100644
--- a/libretro/Makefile.common
+++ b/libretro/Makefile.common
@@ -233,6 +233,7 @@ SOURCES_CXX += \
$(COMMONDIR)/Data/Text/WrapText.cpp \
$(COMMONDIR)/File/VFS/VFS.cpp \
$(COMMONDIR)/File/VFS/AssetReader.cpp \
+ $(COMMONDIR)/File/AndroidStorage.cpp \
$(COMMONDIR)/File/DiskFree.cpp \
$(COMMONDIR)/File/Path.cpp \
$(COMMONDIR)/File/PathBrowser.cpp \