diff --git a/gpgs/src/gpgs_callback.cpp b/gpgs/src/gpgs_callback.cpp index 035833d..59f8a62 100644 --- a/gpgs/src/gpgs_callback.cpp +++ b/gpgs/src/gpgs_callback.cpp @@ -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) @@ -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); @@ -138,11 +137,15 @@ void gpgs_callback_update() return; } - DM_MUTEX_SCOPED_LOCK(m_mutex); + dmArray 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) { @@ -150,6 +153,5 @@ void gpgs_callback_update() data->json = 0; } } - m_callbacksQueue.SetSize(0); } #endif diff --git a/gpgs/src/gpgs_extension.cpp b/gpgs/src/gpgs_extension.cpp index 3411eb7..fba37fc 100644 --- a/gpgs/src/gpgs_extension.cpp +++ b/gpgs/src/gpgs_extension.cpp @@ -8,8 +8,7 @@ #if defined(DM_PLATFORM_ANDROID) #include - -#include "gpgs_jni.h" +#include #include "gpgs_extension.h" #include "private_gpgs_callback.h" #include "com_defold_gpgs_GpgsJNI.h" @@ -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); @@ -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); @@ -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); @@ -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); @@ -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); @@ -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; } @@ -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) { @@ -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; @@ -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; @@ -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); @@ -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); @@ -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); @@ -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) { @@ -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; @@ -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); @@ -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; @@ -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); } @@ -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, "", "(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); diff --git a/gpgs/src/gpgs_jni.h b/gpgs/src/gpgs_jni.h deleted file mode 100644 index 4ec345f..0000000 --- a/gpgs/src/gpgs_jni.h +++ /dev/null @@ -1,54 +0,0 @@ -#pragma once - -#if defined(DM_PLATFORM_ANDROID) - -#include -#include - -struct ThreadAttacher { - JNIEnv *env; - bool has_attached; - ThreadAttacher() : env(NULL), has_attached(false) { - if (dmGraphics::GetNativeAndroidJavaVM()->GetEnv((void **)&env, JNI_VERSION_1_6) != JNI_OK) { - dmGraphics::GetNativeAndroidJavaVM()->AttachCurrentThread(&env, NULL); - has_attached = true; - } - } - ~ThreadAttacher() { - if (has_attached) { - if (env->ExceptionCheck()) { - env->ExceptionDescribe(); - } - env->ExceptionClear(); - dmGraphics::GetNativeAndroidJavaVM()->DetachCurrentThread(); - } - } -}; - -struct ClassLoader { - private: - JNIEnv *env; - jobject class_loader_object; - jmethodID find_class; - public: - ClassLoader(JNIEnv *env) : env(env) { - jclass activity_class = env->FindClass("android/app/NativeActivity"); - jmethodID get_class_loader = env->GetMethodID(activity_class, "getClassLoader", "()Ljava/lang/ClassLoader;"); - class_loader_object = env->CallObjectMethod(dmGraphics::GetNativeAndroidActivity(), get_class_loader); - jclass class_loader = env->FindClass("java/lang/ClassLoader"); - find_class = env->GetMethodID(class_loader, "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;"); - env->DeleteLocalRef(activity_class); - env->DeleteLocalRef(class_loader); - } - ~ClassLoader() { - env->DeleteLocalRef(class_loader_object); - } - jclass load(const char *class_name) { - jstring str_class_name = env->NewStringUTF(class_name); - jclass loaded_class = (jclass)env->CallObjectMethod(class_loader_object, find_class, str_class_name); - env->DeleteLocalRef(str_class_name); - return loaded_class; - } -}; - -#endif \ No newline at end of file