Skip to content

Commit

Permalink
Merge pull request #40 from defold/mutex-fix-and-188
Browse files Browse the repository at this point in the history
Smaller mutex scope + use new SDK android methods (Defold 1.2.188)
  • Loading branch information
AGulev committed Oct 28, 2021
2 parents bc8687d + 789b8fa commit cf4e61d
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 104 deletions.
18 changes: 10 additions & 8 deletions gpgs/src/gpgs_callback.cpp
Expand Up @@ -36,7 +36,7 @@ static void UnregisterCallback()
}
}

static void gpgs_invoke_callback(MESSAGE_ID type, char*json)
static void gpgs_invoke_callback(MESSAGE_ID type, const char* json)
{
GPGS_callback *cbk = &m_callback;
if(cbk->m_Callback == LUA_NOREF)
Expand Down Expand Up @@ -118,12 +118,11 @@ void gpgs_set_callback(lua_State* L, int pos)

void gpgs_add_to_queue(MESSAGE_ID msg, const char*json)
{
DM_MUTEX_SCOPED_LOCK(m_mutex);

CallbackData data;
data.msg = msg;
data.json = json ? strdup(json) : NULL;


DM_MUTEX_SCOPED_LOCK(m_mutex);
if(m_callbacksQueue.Full())
{
m_callbacksQueue.OffsetCapacity(1);
Expand All @@ -138,18 +137,21 @@ void gpgs_callback_update()
return;
}

DM_MUTEX_SCOPED_LOCK(m_mutex);
dmArray<CallbackData> tmp;
{
DM_MUTEX_SCOPED_LOCK(m_mutex);
tmp.Swap(m_callbacksQueue);
}

for(uint32_t i = 0; i != m_callbacksQueue.Size(); ++i)
for(uint32_t i = 0; i != tmp.Size(); ++i)
{
CallbackData* data = &m_callbacksQueue[i];
CallbackData* data = &tmp[i];
gpgs_invoke_callback(data->msg, data->json);
if(data->json)
{
free(data->json);
data->json = 0;
}
}
m_callbacksQueue.SetSize(0);
}
#endif
82 changes: 40 additions & 42 deletions gpgs/src/gpgs_extension.cpp
Expand Up @@ -8,8 +8,7 @@
#if defined(DM_PLATFORM_ANDROID)

#include <string.h>

#include "gpgs_jni.h"
#include <dmsdk/dlib/android.h>
#include "gpgs_extension.h"
#include "private_gpgs_callback.h"
#include "com_defold_gpgs_GpgsJNI.h"
Expand Down Expand Up @@ -163,8 +162,8 @@ static char* luaL_checktable_string(lua_State *L, int numArg, const char* field,
// void method(char*)
static void CallVoidMethodChar(jobject instance, jmethodID method, const char* cstr)
{
ThreadAttacher attacher;
JNIEnv *env = attacher.env;
dmAndroid::ThreadAttacher threadAttacher;
JNIEnv* env = threadAttacher.GetEnv();
jstring jstr = env->NewStringUTF(cstr);
env->CallVoidMethod(instance, method, jstr);
env->DeleteLocalRef(jstr);
Expand All @@ -173,8 +172,8 @@ static void CallVoidMethodChar(jobject instance, jmethodID method, const char* c
// void method(char*, int)
static void CallVoidMethodCharInt(jobject instance, jmethodID method, const char* cstr, int i)
{
ThreadAttacher attacher;
JNIEnv *env = attacher.env;
dmAndroid::ThreadAttacher threadAttacher;
JNIEnv* env = threadAttacher.GetEnv();
jstring jstr = env->NewStringUTF(cstr);
env->CallVoidMethod(instance, method, jstr, i);
env->DeleteLocalRef(jstr);
Expand All @@ -183,8 +182,8 @@ static void CallVoidMethodCharInt(jobject instance, jmethodID method, const char
// void method(char*, int, int)
static void CallVoidMethodCharIntInt(jobject instance, jmethodID method, const char* cstr, int i1, int i2)
{
ThreadAttacher attacher;
JNIEnv *env = attacher.env;
dmAndroid::ThreadAttacher threadAttacher;
JNIEnv* env = threadAttacher.GetEnv();
jstring jstr = env->NewStringUTF(cstr);
env->CallVoidMethod(instance, method, jstr, i1, i2);
env->DeleteLocalRef(jstr);
Expand All @@ -193,8 +192,8 @@ static void CallVoidMethodCharIntInt(jobject instance, jmethodID method, const c
// void method(char*, int, int, int)
static void CallVoidMethodCharIntIntInt(jobject instance, jmethodID method, const char* cstr, int i1, int i2, int i3)
{
ThreadAttacher attacher;
JNIEnv *env = attacher.env;
dmAndroid::ThreadAttacher threadAttacher;
JNIEnv* env = threadAttacher.GetEnv();
jstring jstr = env->NewStringUTF(cstr);
env->CallVoidMethod(instance, method, jstr, i1, i2, i3);
env->DeleteLocalRef(jstr);
Expand All @@ -203,8 +202,8 @@ static void CallVoidMethodCharIntIntInt(jobject instance, jmethodID method, cons
// void method(char*, double)
static void CallVoidMethodCharDouble(jobject instance, jmethodID method, const char* cstr, double d)
{
ThreadAttacher attacher;
JNIEnv *env = attacher.env;
dmAndroid::ThreadAttacher threadAttacher;
JNIEnv* env = threadAttacher.GetEnv();
jstring jstr = env->NewStringUTF(cstr);
env->CallVoidMethod(instance, method, jstr, d);
env->DeleteLocalRef(jstr);
Expand All @@ -213,16 +212,16 @@ static void CallVoidMethodCharDouble(jobject instance, jmethodID method, const c
// void method(int)
static void CallVoidMethodInt(jobject instance, jmethodID method, int i)
{
ThreadAttacher attacher;
JNIEnv *env = attacher.env;
dmAndroid::ThreadAttacher threadAttacher;
JNIEnv* env = threadAttacher.GetEnv();
env->CallVoidMethod(instance, method, i);
}

// void method()
static int CallVoidMethod(jobject instance, jmethodID method)
{
ThreadAttacher attacher;
JNIEnv *env = attacher.env;
dmAndroid::ThreadAttacher threadAttacher;
JNIEnv* env = threadAttacher.GetEnv();
env->CallVoidMethod(instance, method);
return 0;
}
Expand All @@ -231,8 +230,8 @@ static int CallVoidMethod(jobject instance, jmethodID method)
static int CallStringMethod(lua_State* L, jobject instance, jmethodID method)
{
DM_LUA_STACK_CHECK(L, 1);
ThreadAttacher attacher;
JNIEnv *env = attacher.env;
dmAndroid::ThreadAttacher threadAttacher;
JNIEnv* env = threadAttacher.GetEnv();
jstring return_value = (jstring)env->CallObjectMethod(instance, method);
if (return_value)
{
Expand All @@ -252,8 +251,8 @@ static int CallStringMethod(lua_State* L, jobject instance, jmethodID method)
static int CallBooleanMethod(lua_State* L, jobject instance, jmethodID method)
{
DM_LUA_STACK_CHECK(L, 1);
ThreadAttacher attacher;
JNIEnv *env = attacher.env;
dmAndroid::ThreadAttacher threadAttacher;
JNIEnv* env = threadAttacher.GetEnv();
jboolean return_value = (jboolean)env->CallBooleanMethod(instance, method);
lua_pushboolean(L, JNI_TRUE == return_value);
return 1;
Expand All @@ -263,8 +262,8 @@ static int CallBooleanMethod(lua_State* L, jobject instance, jmethodID method)
static int CallIntMethod(lua_State* L, jobject instance, jmethodID method)
{
DM_LUA_STACK_CHECK(L, 1);
ThreadAttacher attacher;
JNIEnv *env = attacher.env;
dmAndroid::ThreadAttacher threadAttacher;
JNIEnv* env = threadAttacher.GetEnv();
int return_value = (int)env->CallIntMethod(instance, method);
lua_pushnumber(L, return_value);
return 1;
Expand Down Expand Up @@ -368,8 +367,8 @@ static int GpgsDisk_SnapshotDisplaySaves(lua_State* L)

DM_LUA_STACK_CHECK(L, 0);

ThreadAttacher attacher;
JNIEnv *env = attacher.env;
dmAndroid::ThreadAttacher threadAttacher;
JNIEnv* env = threadAttacher.GetEnv();

const char* popupTitleDefault = "Game Saves";
char* popupTitle = luaL_checkstringd(L, 1, popupTitleDefault);
Expand All @@ -393,8 +392,8 @@ static int GpgsDisk_SnapshotOpen(lua_State* L)

DM_LUA_STACK_CHECK(L, 0);

ThreadAttacher attacher;
JNIEnv *env = attacher.env;
dmAndroid::ThreadAttacher threadAttacher;
JNIEnv* env = threadAttacher.GetEnv();

const char* saveName = luaL_checkstring(L, 1);
bool createIfNotFound = luaL_checkboold(L, 2, false);
Expand All @@ -416,8 +415,8 @@ static int GpgsDisk_SnapshotCommitAndClose(lua_State* L)

DM_LUA_STACK_CHECK(L, 0);

ThreadAttacher attacher;
JNIEnv *env = attacher.env;
dmAndroid::ThreadAttacher threadAttacher;
JNIEnv* env = threadAttacher.GetEnv();

long playedTime = luaL_checktable_number(L, 1, "playedTime", -1);
long progressValue = luaL_checktable_number(L, 1, "progressValue", -1);
Expand All @@ -436,7 +435,7 @@ static int GpgsDisk_SnapshotCommitAndClose(lua_State* L)
env->SetByteArrayRegion(jcoverImage, 0, length, (jbyte*)coverImage);
}

env->CallVoidMethod(g_gpgs.m_GpgsJNI, g_gpgs_disk.m_commitAndCloseSnapshot, (jlong)playedTime, (jlong)progressValue, jdescription, jcoverImage);
env->CallVoidMethod(g_gpgs.m_GpgsJNI, g_gpgs_disk.m_commitAndCloseSnapshot, playedTime, progressValue, jdescription, jcoverImage);

if (jdescription)
{
Expand All @@ -453,8 +452,8 @@ static int GpgsDisk_SnapshotGetData(lua_State* L)
return 0;
}

ThreadAttacher attacher;
JNIEnv *env = attacher.env;
dmAndroid::ThreadAttacher threadAttacher;
JNIEnv* env = threadAttacher.GetEnv();

int lenght = 0;
jbyte* snapshot = NULL;
Expand Down Expand Up @@ -486,8 +485,8 @@ static int GpgsDisk_SnapshotSetData(lua_State* L)

DM_LUA_STACK_CHECK(L, 2);

ThreadAttacher attacher;
JNIEnv *env = attacher.env;
dmAndroid::ThreadAttacher threadAttacher;
JNIEnv* env = threadAttacher.GetEnv();

size_t bytes_lenght;
const char* bytes = luaL_checklstring(L, 1, &bytes_lenght);
Expand Down Expand Up @@ -548,8 +547,8 @@ static int GpgsDisk_SnapshotGetConflictingData(lua_State* L)
return 0;
}

ThreadAttacher attacher;
JNIEnv *env = attacher.env;
dmAndroid::ThreadAttacher threadAttacher;
JNIEnv* env = threadAttacher.GetEnv();

int lenght = 0;
jbyte* snapshot = NULL;
Expand Down Expand Up @@ -735,8 +734,8 @@ static int GpgsEvent_Get(lua_State* L)

static void OnActivityResult(void *env, void* activity, int32_t request_code, int32_t result_code, void* result)
{
ThreadAttacher attacher;
JNIEnv *_env = attacher.env;
dmAndroid::ThreadAttacher threadAttacher;
JNIEnv* _env = threadAttacher.GetEnv();

_env->CallVoidMethod(g_gpgs.m_GpgsJNI, g_gpgs.m_activityResult, request_code, result_code, result);
}
Expand Down Expand Up @@ -941,17 +940,16 @@ static void InitializeJNI(const char* client_id, bool request_server_auth_code,
{
CheckInitializationParams(client_id, request_server_auth_code > 0, request_id_token > 0);

ThreadAttacher attacher;
JNIEnv *env = attacher.env;
ClassLoader class_loader = ClassLoader(env);
jclass cls = class_loader.load("com.defold.gpgs.GpgsJNI");
dmAndroid::ThreadAttacher threadAttacher;
JNIEnv* env = threadAttacher.GetEnv();
jclass cls = dmAndroid::LoadClass(env, "com.defold.gpgs.GpgsJNI");

InitJNIMethods(env, cls);

jmethodID jni_constructor = env->GetMethodID(cls, "<init>", "(Landroid/app/Activity;ZZZLjava/lang/String;)V");
jstring java_client_id = env->NewStringUTF(client_id);

g_gpgs.m_GpgsJNI = env->NewGlobalRef(env->NewObject(cls, jni_constructor, dmGraphics::GetNativeAndroidActivity(),
g_gpgs.m_GpgsJNI = env->NewGlobalRef(env->NewObject(cls, jni_constructor, threadAttacher.GetActivity()->clazz,
g_gpgs_disk.is_using, request_server_auth_code, request_id_token, java_client_id));

env->DeleteLocalRef(java_client_id);
Expand Down
54 changes: 0 additions & 54 deletions gpgs/src/gpgs_jni.h

This file was deleted.

0 comments on commit cf4e61d

Please sign in to comment.