Minor improvements and fixes to Android-specific code.

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