]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/porting_android.cpp
Conf.example: Update using auto-generation
[dragonfireclient.git] / src / porting_android.cpp
index c7e28cc9a1e57a686e666f64e86bfb1cd2dd8446..7c74f7b5b22dda0d4d3e7fa1a16fc3e09d4f0e9c 100644 (file)
@@ -31,7 +31,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #include <sstream>
 #include <exception>
-#include <stdlib.h>
+#include <cstdlib>
 
 #ifdef GPROF
 #include "prof.h"
@@ -164,29 +164,63 @@ void cleanupAndroid()
        jvm->DetachCurrentThread();
 }
 
-void setExternalStorageDir(JNIEnv* lJNIEnv)
+static std::string javaStringToUTF8(jstring js)
 {
-       // Android: Retrieve ablsolute path to external storage device (sdcard)
-       jclass ClassEnv      = lJNIEnv->FindClass("android/os/Environment");
-       jmethodID MethodDir  =
-                       lJNIEnv->GetStaticMethodID(ClassEnv,
-                                       "getExternalStorageDirectory","()Ljava/io/File;");
-       jobject ObjectFile   = lJNIEnv->CallStaticObjectMethod(ClassEnv, MethodDir);
-       jclass ClassFile     = lJNIEnv->FindClass("java/io/File");
-
-       jmethodID MethodPath =
-                       lJNIEnv->GetMethodID(ClassFile, "getAbsolutePath",
-                                       "()Ljava/lang/String;");
-       jstring StringPath   =
-                       (jstring) lJNIEnv->CallObjectMethod(ObjectFile, MethodPath);
-
-       const char *externalPath = lJNIEnv->GetStringUTFChars(StringPath, NULL);
-       std::string userPath(externalPath);
-       lJNIEnv->ReleaseStringUTFChars(StringPath, externalPath);
-
-       path_storage             = userPath;
-       path_user                = userPath + DIR_DELIM + PROJECT_NAME_C;
-       path_share               = userPath + DIR_DELIM + PROJECT_NAME_C;
+       std::string str;
+       // Get string as a UTF-8 c-string
+       const char *c_str = jnienv->GetStringUTFChars(js, NULL);
+       // Save it
+       str = c_str;
+       // And free the c-string
+       jnienv->ReleaseStringUTFChars(js, c_str);
+       return str;
+}
+
+// Calls static method if obj is NULL
+static std::string getAndroidPath(jclass cls, jobject obj, jclass cls_File,
+               jmethodID mt_getAbsPath, const char *getter)
+{
+       // Get getter method
+       jmethodID mt_getter;
+       if (obj)
+               mt_getter = jnienv->GetMethodID(cls, getter,
+                               "()Ljava/io/File;");
+       else
+               mt_getter = jnienv->GetStaticMethodID(cls, getter,
+                               "()Ljava/io/File;");
+
+       // Call getter
+       jobject ob_file;
+       if (obj)
+               ob_file = jnienv->CallObjectMethod(obj, mt_getter);
+       else
+               ob_file = jnienv->CallStaticObjectMethod(cls, mt_getter);
+
+       // Call getAbsolutePath
+       jstring js_path = (jstring) jnienv->CallObjectMethod(ob_file,
+                       mt_getAbsPath);
+
+       return javaStringToUTF8(js_path);
+}
+
+void initializePathsAndroid()
+{
+       // Get Environment class
+       jclass cls_Env = jnienv->FindClass("android/os/Environment");
+       // Get File class
+       jclass cls_File = jnienv->FindClass("java/io/File");
+       // Get getAbsolutePath method
+       jmethodID mt_getAbsPath = jnienv->GetMethodID(cls_File,
+                               "getAbsolutePath", "()Ljava/lang/String;");
+
+       path_cache   = getAndroidPath(nativeActivity, app_global->activity->clazz,
+                       cls_File, mt_getAbsPath, "getCacheDir");
+       path_storage = getAndroidPath(cls_Env, NULL, cls_File, mt_getAbsPath,
+                       "getExternalStorageDirectory");
+       path_user    = path_storage + DIR_DELIM + PROJECT_NAME_C;
+       path_share   = path_storage + DIR_DELIM + PROJECT_NAME_C;
+
+       migrateCachePath();
 }
 
 void showInputDialog(const std::string& acceptButton, const  std::string& hint,