Преглед на файлове

Data dir returns a symlink in Android 6.0, which confuses DirAccess on android, this should fix it

Juan Linietsky преди 9 години
родител
ревизия
973a12c5f2
променени са 2 файла, в които са добавени 29 реда и са изтрити 2 реда
  1. 27 2
      platform/android/os_android.cpp
  2. 2 0
      platform/android/os_android.h

+ 27 - 2
platform/android/os_android.cpp

@@ -708,8 +708,33 @@ void OS_Android::set_need_reload_hooks(bool p_needs_them) {
 
 String OS_Android::get_data_dir() const {
 
-	if (get_data_dir_func)
-		return get_data_dir_func();
+	if (data_dir_cache!=String())
+		return data_dir_cache;
+
+	if (get_data_dir_func) {
+		String data_dir=get_data_dir_func();
+
+		//store current dir
+		char real_current_dir_name[2048];
+		getcwd(real_current_dir_name,2048);
+
+		//go to data dir
+		chdir(data_dir.utf8().get_data());
+
+		//get actual data dir, so we resolve potential symlink (Android 6.0+ seems to use symlink)
+		char data_current_dir_name[2048];
+		getcwd(data_current_dir_name,2048);
+
+		//cache by parsing utf8
+		data_dir_cache.parse_utf8(data_current_dir_name);
+
+		//restore original dir so we don't mess things up
+		chdir(real_current_dir_name);
+
+		return data_dir_cache
+	}
+
+
 	return ".";
 	//return Globals::get_singleton()->get_singleton_object("GodotOS")->call("get_data_dir");
 };

+ 2 - 0
platform/android/os_android.h

@@ -123,6 +123,8 @@ private:
 	PhysicsServer *physics_server;
 	Physics2DServer *physics_2d_server;
 
+	mutable String data_dir_cache;
+
 #if 0
 	AudioDriverAndroid audio_driver_android;
 #else