Skip to content

Commit

Permalink
Android: Initial SDL3 support.
Browse files Browse the repository at this point in the history
  • Loading branch information
MikuAuahDark committed Oct 12, 2024
1 parent 05eddac commit 86bb7ba
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 34 deletions.
78 changes: 45 additions & 33 deletions src/common/android.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand All @@ -40,15 +44,23 @@
#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
{

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");
Expand All @@ -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");
Expand All @@ -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");
Expand All @@ -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;");
Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -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()))
Expand Down Expand Up @@ -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");
Expand All @@ -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");
Expand All @@ -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");

Expand All @@ -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");

Expand All @@ -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);
Expand All @@ -339,12 +351,12 @@ class AssetManagerObject

~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);
Expand Down Expand Up @@ -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());
}

Expand Down Expand Up @@ -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;");
Expand Down Expand Up @@ -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;");
Expand Down Expand Up @@ -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;");
Expand All @@ -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");
Expand Down Expand Up @@ -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;
}

Expand Down
13 changes: 12 additions & 1 deletion src/modules/filesystem/physfs/Filesystem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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)
{
Expand Down
4 changes: 4 additions & 0 deletions src/modules/love/love.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 86bb7ba

Please sign in to comment.