mirror of
https://github.com/love2d/love.git
synced 2026-08-12 08:30:56 +02:00
Android: Initial SDL3 support.
This commit is contained in:
+45
-33
@@ -27,7 +27,11 @@
|
||||
#include <set>
|
||||
#include <unordered_map>
|
||||
|
||||
#if __has_include(<SDL3/SDL.h>)
|
||||
#include <SDL3/SDL.h>
|
||||
#else
|
||||
#include <SDL.h>
|
||||
#endif
|
||||
|
||||
#include <jni.h>
|
||||
#include <android/asset_manager.h>
|
||||
@@ -40,6 +44,14 @@
|
||||
#include "libraries/physfs/physfs.h"
|
||||
#include "filesystem/physfs/PhysfsIo.h"
|
||||
|
||||
// Backward compatibility
|
||||
#if !SDL_VERSION_ATLEAST(3, 0, 0)
|
||||
#define SDL_GetAndroidJNIEnv SDL_AndroidGetJNIEnv
|
||||
#define SDL_GetAndroidActivity SDL_AndroidGetActivity
|
||||
#define SDL_GetAndroidInternalStoragePath SDL_AndroidGetInternalStoragePath
|
||||
#define SDL_GetAndroidExternalStoragePath SDL_AndroidGetExternalStoragePath
|
||||
#endif
|
||||
|
||||
namespace love
|
||||
{
|
||||
namespace android
|
||||
@@ -47,8 +59,8 @@ namespace android
|
||||
|
||||
void setImmersive(bool immersive_active)
|
||||
{
|
||||
JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv();
|
||||
jobject activity = (jobject) SDL_AndroidGetActivity();
|
||||
JNIEnv *env = (JNIEnv*) SDL_GetAndroidJNIEnv();
|
||||
jobject activity = (jobject) SDL_GetAndroidActivity();
|
||||
jclass clazz = env->GetObjectClass(activity);
|
||||
|
||||
static jmethodID setImmersiveMethod = env->GetMethodID(clazz, "setImmersiveMode", "(Z)V");
|
||||
@@ -60,8 +72,8 @@ void setImmersive(bool immersive_active)
|
||||
|
||||
bool getImmersive()
|
||||
{
|
||||
JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv();
|
||||
jobject activity = (jobject) SDL_AndroidGetActivity();
|
||||
JNIEnv *env = (JNIEnv*) SDL_GetAndroidJNIEnv();
|
||||
jobject activity = (jobject) SDL_GetAndroidActivity();
|
||||
jclass clazz = env->GetObjectClass(activity);
|
||||
|
||||
static jmethodID getImmersiveMethod = env->GetMethodID(clazz, "getImmersiveMode", "()Z");
|
||||
@@ -79,8 +91,8 @@ double getScreenScale()
|
||||
|
||||
if (result == -1.)
|
||||
{
|
||||
JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv();
|
||||
jobject activity = (jobject) SDL_AndroidGetActivity();
|
||||
JNIEnv *env = (JNIEnv*) SDL_GetAndroidJNIEnv();
|
||||
jobject activity = (jobject) SDL_GetAndroidActivity();
|
||||
jclass clazz = env->GetObjectClass(activity);
|
||||
|
||||
jmethodID getDPIMethod = env->GetMethodID(clazz, "getDPIScale", "()F");
|
||||
@@ -95,8 +107,8 @@ double getScreenScale()
|
||||
|
||||
bool getSafeArea(int &top, int &left, int &bottom, int &right)
|
||||
{
|
||||
JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv();
|
||||
jobject activity = (jobject) SDL_AndroidGetActivity();
|
||||
JNIEnv *env = (JNIEnv*) SDL_GetAndroidJNIEnv();
|
||||
jobject activity = (jobject) SDL_GetAndroidActivity();
|
||||
jclass clazz = env->GetObjectClass(activity);
|
||||
jclass rectClass = env->FindClass("android/graphics/Rect");
|
||||
jmethodID methodID = env->GetMethodID(clazz, "getSafeArea", "()Landroid/graphics/Rect;");
|
||||
@@ -125,8 +137,8 @@ bool openURL(const std::string &url)
|
||||
|
||||
void vibrate(double seconds)
|
||||
{
|
||||
JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv();
|
||||
jobject activity = (jobject) SDL_AndroidGetActivity();
|
||||
JNIEnv *env = (JNIEnv*) SDL_GetAndroidJNIEnv();
|
||||
jobject activity = (jobject) SDL_GetAndroidActivity();
|
||||
jclass clazz = env->GetObjectClass(activity);
|
||||
|
||||
static jmethodID vibrateMethod = env->GetMethodID(clazz, "vibrate", "(D)V");
|
||||
@@ -198,8 +210,8 @@ inline bool tryCreateDirectory(const char *path)
|
||||
|
||||
bool createStorageDirectories()
|
||||
{
|
||||
std::string internalStoragePath = SDL_AndroidGetInternalStoragePath();
|
||||
std::string externalStoragePath = SDL_AndroidGetExternalStoragePath();
|
||||
std::string internalStoragePath = SDL_GetAndroidInternalStoragePath();
|
||||
std::string externalStoragePath = SDL_GetAndroidExternalStoragePath();
|
||||
|
||||
std::string saveDirectoryInternal = internalStoragePath + "/save";
|
||||
if (!tryCreateDirectory(saveDirectoryInternal.c_str()))
|
||||
@@ -257,8 +269,8 @@ void fixupExternalStoragePermission(const std::string &savedir, const std::strin
|
||||
|
||||
bool hasBackgroundMusic()
|
||||
{
|
||||
JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv();
|
||||
jobject activity = (jobject) SDL_AndroidGetActivity();
|
||||
JNIEnv *env = (JNIEnv*) SDL_GetAndroidJNIEnv();
|
||||
jobject activity = (jobject) SDL_GetAndroidActivity();
|
||||
|
||||
jclass clazz(env->GetObjectClass(activity));
|
||||
jmethodID method_id = env->GetMethodID(clazz, "hasBackgroundMusic", "()Z");
|
||||
@@ -273,8 +285,8 @@ bool hasBackgroundMusic()
|
||||
|
||||
bool hasRecordingPermission()
|
||||
{
|
||||
JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv();
|
||||
jobject activity = (jobject) SDL_AndroidGetActivity();
|
||||
JNIEnv *env = (JNIEnv*) SDL_GetAndroidJNIEnv();
|
||||
jobject activity = (jobject) SDL_GetAndroidActivity();
|
||||
jclass clazz = env->GetObjectClass(activity);
|
||||
|
||||
static jmethodID methodID = env->GetMethodID(clazz, "hasRecordAudioPermission", "()Z");
|
||||
@@ -294,8 +306,8 @@ bool hasRecordingPermission()
|
||||
|
||||
void requestRecordingPermission()
|
||||
{
|
||||
JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv();
|
||||
jobject activity = (jobject) SDL_AndroidGetActivity();
|
||||
JNIEnv *env = (JNIEnv*) SDL_GetAndroidJNIEnv();
|
||||
jobject activity = (jobject) SDL_GetAndroidActivity();
|
||||
jclass clazz(env->GetObjectClass(activity));
|
||||
jmethodID methodID = env->GetMethodID(clazz, "requestRecordAudioPermission", "()V");
|
||||
|
||||
@@ -310,8 +322,8 @@ void requestRecordingPermission()
|
||||
|
||||
void showRecordingPermissionMissingDialog()
|
||||
{
|
||||
JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv();
|
||||
jobject activity = (jobject) SDL_AndroidGetActivity();
|
||||
JNIEnv *env = (JNIEnv*) SDL_GetAndroidJNIEnv();
|
||||
jobject activity = (jobject) SDL_GetAndroidActivity();
|
||||
jclass clazz(env->GetObjectClass(activity));
|
||||
jmethodID methodID = env->GetMethodID(clazz, "showRecordingAudioPermissionMissingDialog", "()V");
|
||||
|
||||
@@ -330,7 +342,7 @@ class AssetManagerObject
|
||||
public:
|
||||
AssetManagerObject()
|
||||
{
|
||||
JNIEnv *env = (JNIEnv *) SDL_AndroidGetJNIEnv();
|
||||
JNIEnv *env = (JNIEnv *) SDL_GetAndroidJNIEnv();
|
||||
jobject am = getLocalAssetManager(env);
|
||||
|
||||
assetManager = env->NewGlobalRef(am);
|
||||
@@ -339,12 +351,12 @@ public:
|
||||
|
||||
~AssetManagerObject()
|
||||
{
|
||||
JNIEnv *env = (JNIEnv *) SDL_AndroidGetJNIEnv();
|
||||
JNIEnv *env = (JNIEnv *) SDL_GetAndroidJNIEnv();
|
||||
env->DeleteGlobalRef(assetManager);
|
||||
}
|
||||
|
||||
static jobject getLocalAssetManager(JNIEnv *env) {
|
||||
jobject self = (jobject) SDL_AndroidGetActivity();
|
||||
jobject self = (jobject) SDL_GetAndroidActivity();
|
||||
jclass activity = env->GetObjectClass(self);
|
||||
jmethodID method = env->GetMethodID(activity, "getAssets", "()Landroid/content/res/AssetManager;");
|
||||
jobject am = env->CallObjectMethod(self, method);
|
||||
@@ -375,7 +387,7 @@ static jobject getJavaAssetManager()
|
||||
|
||||
static AAssetManager *getAssetManager()
|
||||
{
|
||||
JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv();
|
||||
JNIEnv *env = (JNIEnv*) SDL_GetAndroidJNIEnv();
|
||||
return AAssetManager_fromJava(env, (jobject) getJavaAssetManager());
|
||||
}
|
||||
|
||||
@@ -489,8 +501,8 @@ void *openArchive(PHYSFS_Io *io, const char *name, int forWrite, int *claimed)
|
||||
{
|
||||
// AAssetDir_getNextFileName intentionally excludes directories, so
|
||||
// we have to use JNI that calls AssetManager.list() recursively.
|
||||
JNIEnv *env = (JNIEnv *) SDL_AndroidGetJNIEnv();
|
||||
jobject activity = (jobject) SDL_AndroidGetActivity();
|
||||
JNIEnv *env = (JNIEnv *) SDL_GetAndroidJNIEnv();
|
||||
jobject activity = (jobject) SDL_GetAndroidActivity();
|
||||
jclass clazz = env->GetObjectClass(activity);
|
||||
|
||||
jmethodID method = env->GetMethodID(clazz, "buildFileTree", "()[Ljava/lang/String;");
|
||||
@@ -541,7 +553,7 @@ PHYSFS_EnumerateCallbackResult enumerate(
|
||||
}
|
||||
}
|
||||
|
||||
JNIEnv *env = (JNIEnv *) SDL_AndroidGetJNIEnv();
|
||||
JNIEnv *env = (JNIEnv *) SDL_GetAndroidJNIEnv();
|
||||
jobject assetManager = getJavaAssetManager();
|
||||
jclass clazz = env->GetObjectClass(assetManager);
|
||||
jmethodID method = env->GetMethodID(clazz, "list", "(Ljava/lang/String;)[Ljava/lang/String;");
|
||||
@@ -760,8 +772,8 @@ const char *getCRequirePath()
|
||||
|
||||
if (!initialized)
|
||||
{
|
||||
JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv();
|
||||
jobject activity = (jobject) SDL_AndroidGetActivity();
|
||||
JNIEnv *env = (JNIEnv*) SDL_GetAndroidJNIEnv();
|
||||
jobject activity = (jobject) SDL_GetAndroidActivity();
|
||||
jclass clazz = env->GetObjectClass(activity);
|
||||
|
||||
static jmethodID getCRequireMethod = env->GetMethodID(clazz, "getCRequirePath", "()Ljava/lang/String;");
|
||||
@@ -788,8 +800,8 @@ int getFDFromContentProtocol(const char *path)
|
||||
|
||||
if (strstr(path, "content://") == path)
|
||||
{
|
||||
JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv();
|
||||
jobject activity = (jobject) SDL_AndroidGetActivity();
|
||||
JNIEnv *env = (JNIEnv*) SDL_GetAndroidJNIEnv();
|
||||
jobject activity = (jobject) SDL_GetAndroidActivity();
|
||||
jclass clazz = env->GetObjectClass(activity);
|
||||
|
||||
static jmethodID converter = env->GetMethodID(clazz, "convertToFileDescriptor", "(Ljava/lang/String;)I");
|
||||
@@ -926,8 +938,8 @@ void *getIOFromFD(int fd)
|
||||
const char *getArg0()
|
||||
{
|
||||
static PHYSFS_AndroidInit androidInit = {nullptr, nullptr};
|
||||
androidInit.jnienv = SDL_AndroidGetJNIEnv();
|
||||
androidInit.context = SDL_AndroidGetActivity();
|
||||
androidInit.jnienv = SDL_GetAndroidJNIEnv();
|
||||
androidInit.context = SDL_GetAndroidActivity();
|
||||
return (const char *) &androidInit;
|
||||
}
|
||||
|
||||
|
||||
@@ -62,7 +62,11 @@
|
||||
#include <string>
|
||||
|
||||
#ifdef LOVE_ANDROID
|
||||
#if __has_include(<SDL3/SDL.h>)
|
||||
#include <SDL3/SDL.h>
|
||||
#else
|
||||
#include <SDL.h>
|
||||
#endif
|
||||
#include "common/android.h"
|
||||
#endif
|
||||
|
||||
@@ -630,10 +634,17 @@ std::string Filesystem::getFullCommonPath(CommonPath path)
|
||||
#elif defined(LOVE_ANDROID)
|
||||
|
||||
std::string storagepath;
|
||||
if (isAndroidSaveExternal())
|
||||
#if SDL_VERSION_ATLEAST(3, 0, 0)
|
||||
if (isAndroidSaveExternal())
|
||||
storagepath = SDL_GetAndroidExternalStoragePath();
|
||||
else
|
||||
storagepath = SDL_GetAndroidInternalStoragePath();
|
||||
#else
|
||||
if (isAndroidSaveExternal())
|
||||
storagepath = SDL_AndroidGetExternalStoragePath();
|
||||
else
|
||||
storagepath = SDL_AndroidGetInternalStoragePath();
|
||||
#endif
|
||||
|
||||
switch (path)
|
||||
{
|
||||
|
||||
@@ -37,7 +37,11 @@
|
||||
#endif // LOVE_WINDOWS
|
||||
|
||||
#ifdef LOVE_ANDROID
|
||||
#if __has_include(<SDL3/SDL.h>)
|
||||
#include <SDL3/SDL.h>
|
||||
#else
|
||||
#include <SDL.h>
|
||||
#endif
|
||||
#endif // LOVE_ANDROID
|
||||
|
||||
#ifdef LOVE_LEGENDARY_CONSOLE_IO_HACK
|
||||
|
||||
Reference in New Issue
Block a user