mirror of
https://github.com/love2d/love.git
synced 2026-08-19 12:14:20 +02:00
Minor improvements and fixes to Android-specific code.
This commit is contained in:
+45
-63
@@ -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;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user