Browse Source

Minor improvements and fixes to Android-specific code.

Miku AuahDark 3 years ago
parent
commit
2822f17a39
1 changed files with 45 additions and 63 deletions
  1. 45 63
      src/common/android.cpp

+ 45 - 63
src/common/android.cpp

@@ -46,13 +46,11 @@ namespace android
 void setImmersive(bool immersive_active)
 {
 	JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv();
-
 	jobject activity = (jobject) SDL_AndroidGetActivity();
+	jclass clazz = env->GetObjectClass(activity);
 
-	jclass clazz(env->GetObjectClass(activity));
-	jmethodID method_id = env->GetMethodID(clazz, "setImmersiveMode", "(Z)V");
-
-	env->CallVoidMethod(activity, method_id, immersive_active);
+	static jmethodID setImmersiveMethod = env->GetMethodID(clazz, "setImmersiveMode", "(Z)V");
+	env->CallVoidMethod(activity, setImmersiveMethod, immersive_active);
 
 	env->DeleteLocalRef(activity);
 	env->DeleteLocalRef(clazz);
@@ -61,18 +59,16 @@ void setImmersive(bool immersive_active)
 bool getImmersive()
 {
 	JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv();
-
 	jobject activity = (jobject) SDL_AndroidGetActivity();
+	jclass clazz = env->GetObjectClass(activity);
 
-	jclass clazz(env->GetObjectClass(activity));
-	jmethodID method_id = env->GetMethodID(clazz, "getImmersiveMode", "()Z");
-
-	jboolean immersive_active = env->CallBooleanMethod(activity, method_id);
+	static jmethodID getImmersiveMethod = env->GetMethodID(clazz, "getImmersiveMode", "()Z");
+	jboolean immersiveActive = env->CallBooleanMethod(activity, getImmersiveMethod);
 
 	env->DeleteLocalRef(activity);
 	env->DeleteLocalRef(clazz);
 
-	return immersive_active;
+	return immersiveActive;
 }
 
 double getScreenScale()
@@ -82,16 +78,13 @@ double getScreenScale()
 	if (result == -1.)
 	{
 		JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv();
-		jclass activity = env->FindClass("org/love2d/android/GameActivity");
-
-		jmethodID getMetrics = env->GetStaticMethodID(activity, "getDisplayMetrics", "()Landroid/util/DisplayMetrics;");
-		jobject metrics = env->CallStaticObjectMethod(activity, getMetrics);
-		jclass metricsClass = env->GetObjectClass(metrics);
+		jobject activity = (jobject) SDL_AndroidGetActivity();
+		jclass clazz = env->GetObjectClass(activity);
 
-		result = env->GetFloatField(metrics, env->GetFieldID(metricsClass, "density", "F"));
+		jmethodID getDPIMethod = env->GetMethodID(clazz, "getDPIScale", "()F");
+		result = (double) env->CallFloatMethod(activity, getDPIMethod);
 
-		env->DeleteLocalRef(metricsClass);
-		env->DeleteLocalRef(metrics);
+		env->DeleteLocalRef(clazz);
 		env->DeleteLocalRef(activity);
 	}
 
@@ -102,8 +95,10 @@ bool getSafeArea(int &top, int &left, int &bottom, int &right)
 {
 	JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv();
 	jobject activity = (jobject) SDL_AndroidGetActivity();
-	jclass clazz(env->GetObjectClass(activity));
-	jmethodID methodID = env->GetMethodID(clazz, "getSafeArea", "()Z");
+	jclass clazz = env->GetObjectClass(activity);
+
+	static jmethodID methodID = env->GetMethodID(clazz, "getSafeArea", "()Z");
+
 	bool hasSafeArea = false;
 
 	if (methodID == nullptr)
@@ -126,33 +121,33 @@ bool getSafeArea(int &top, int &left, int &bottom, int &right)
 bool openURL(const std::string &url)
 {
 	JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv();
-	jclass activity = env->FindClass("org/love2d/android/GameActivity");
+	jobject activity = (jobject) SDL_AndroidGetActivity();
+	jclass clazz = env->GetObjectClass(activity);
 
-	jmethodID openURL = env->GetStaticMethodID(activity, "openURLFromLOVE", "(Ljava/lang/String;)Z");
+	static jmethodID openURL = env->GetMethodID(clazz, "openURLFromLOVE", "(Ljava/lang/String;)Z");
 
 	if (openURL == nullptr)
-	{
-		env->ExceptionClear();
-		openURL = env->GetStaticMethodID(activity, "openURL", "(Ljava/lang/String;)Z");
-	}
-
-	jstring url_jstring = (jstring) env->NewStringUTF(url.c_str());
+		return false;
 
-	jboolean result = env->CallStaticBooleanMethod(activity, openURL, url_jstring);
+	jstring jstringURL = env->NewStringUTF(url.c_str());
+	jboolean result = env->CallBooleanMethod(clazz, openURL, jstringURL);
 
-	env->DeleteLocalRef(url_jstring);
+	env->DeleteLocalRef(jstringURL);
+	env->DeleteLocalRef(clazz);
 	env->DeleteLocalRef(activity);
-	return result;
+	return (bool) result;
 }
 
 void vibrate(double seconds)
 {
 	JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv();
-	jclass activity = env->FindClass("org/love2d/android/GameActivity");
+	jobject activity = (jobject) SDL_AndroidGetActivity();
+	jclass clazz = env->GetObjectClass(activity);
 
-	jmethodID vibrate_method = env->GetStaticMethodID(activity, "vibrate", "(D)V");
-	env->CallStaticVoidMethod(activity, vibrate_method, seconds);
+	static jmethodID vibrateMethod = env->GetMethodID(clazz, "vibrate", "(D)V");
+	env->CallVoidMethod(activity, vibrateMethod, seconds);
 
+	env->DeleteLocalRef(clazz);
 	env->DeleteLocalRef(activity);
 }
 
@@ -167,7 +162,7 @@ void freeGameArchiveMemory(void *ptr)
 
 bool directoryExists(const char *path)
 {
-	struct stat s;
+	struct stat s {};
 	int err = stat(path, &s);
 	if (err == -1)
 	{
@@ -226,9 +221,9 @@ bool hasRecordingPermission()
 {
 	JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv();
 	jobject activity = (jobject) SDL_AndroidGetActivity();
+	jclass clazz = env->GetObjectClass(activity);
 
-	jclass clazz(env->GetObjectClass(activity));
-	jmethodID methodID = env->GetMethodID(clazz, "hasRecordAudioPermission", "()Z");
+	static jmethodID methodID = env->GetMethodID(clazz, "hasRecordAudioPermission", "()Z");
 	jboolean result = false;
 
 	if (methodID == nullptr)
@@ -724,7 +719,7 @@ bool checkFusedGame(void **physfsIO_Out)
 const char *getCRequirePath()
 {
 	static bool initialized = false;
-	static const char *path = nullptr;
+	static std::string path;
 
 	if (!initialized)
 	{
@@ -732,35 +727,22 @@ const char *getCRequirePath()
 		jobject activity = (jobject) SDL_AndroidGetActivity();
 
 		jclass clazz(env->GetObjectClass(activity));
-		jmethodID method_id = env->GetMethodID(clazz, "getCRequirePath", "()Ljava/lang/String;");
-
-		path = "";
-		initialized = true;
+		jmethodID getCRequireMethod = env->GetMethodID(clazz, "getCRequirePath", "()Ljava/lang/String;");
 
-		if (method_id)
-		{
-			jstring cpath = (jstring) env->CallObjectMethod(activity, method_id);
-			const char *utf = env->GetStringUTFChars(cpath, nullptr);
-			if (utf)
-			{
-				path = SDL_strdup(utf);
-				env->ReleaseStringUTFChars(cpath, utf);
-			}
-
-			env->DeleteLocalRef(cpath);
-		}
-		else
+		jstring cpath = (jstring) env->CallObjectMethod(activity, getCRequireMethod);
+		const char *utf = env->GetStringUTFChars(cpath, nullptr);
+		if (utf)
 		{
-			// NoSuchMethodException is thrown in case methodID is null
-			env->ExceptionClear();
-			return "";
+			path = utf;
+			env->ReleaseStringUTFChars(cpath, utf);
 		}
 
+		env->DeleteLocalRef(cpath);
 		env->DeleteLocalRef(activity);
 		env->DeleteLocalRef(clazz);
 	}
 
-	return path;
+	return path.c_str();
 }
 
 int getFDFromLoveProtocol(const char *path)
@@ -787,9 +769,9 @@ int getFDFromLoveProtocol(const char *path)
 class FileDescriptorTracker: public love::Object
 {
 public:
-	FileDescriptorTracker(int fd): Object(), fd(fd) {}
-	~FileDescriptorTracker() { close(fd); }
-	int getFd() { return fd; }
+	explicit FileDescriptorTracker(int fd): Object(), fd(fd) {}
+	~FileDescriptorTracker() override { close(fd); }
+	int getFd() const { return fd; }
 private:
 	int fd;
 };