diff --git a/siwg/src/siwg.cpp b/siwg/src/siwg.cpp index ec1431f..d03e64a 100644 --- a/siwg/src/siwg.cpp +++ b/siwg/src/siwg.cpp @@ -7,10 +7,12 @@ #if defined(DM_PLATFORM_ANDROID) +#include + #include #include "siwg.h" -#include "siwg_jni.h" +// #include "siwg_jni.h" #include "siwg_callback.h" #include "com_aterve_siwg_SiwgJNI.h" @@ -96,8 +98,8 @@ static char* luaL_checktable_string(lua_State *L, int numArg, const char* field, // 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; } @@ -106,8 +108,9 @@ 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) { @@ -127,8 +130,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; @@ -219,12 +222,9 @@ static int SiwgAuth_set_callback(lua_State* L) // JNI Extension Methods // -static void OnActivityResult(void *env, void* activity, int32_t request_code, int32_t result_code, void* result) +static void OnActivityResult(JNIEnv* env, jobject activity, int32_t request_code, int32_t result_code, void* result) { - ThreadAttacher attacher; - JNIEnv *_env = attacher.env; - - _env->CallVoidMethod(g_siwg.m_SiwgJNI, g_siwg.m_activityResult, request_code, result_code, result); + env->CallVoidMethod(g_siwg.m_SiwgJNI, g_siwg.m_activityResult, request_code, result_code, result); } JNIEXPORT void JNICALL Java_com_aterve_siwg_SiwgJNI_siwgAddToQueue(JNIEnv * env, jclass cls, jint jmsg, jstring jjson) @@ -322,10 +322,9 @@ static void InitializeJNI(const char* client_id, bool request_server_auth_code, CheckInitializationParams(client_id, request_server_auth_code > 0, request_id_token > 0); dmLogInfo("[SIWG] InitJNI Checked Params"); - ThreadAttacher attacher; - JNIEnv *env = attacher.env; - ClassLoader class_loader = ClassLoader(env); - jclass cls = class_loader.load("com.aterve.siwg.SiwgJNI"); + dmAndroid::ThreadAttacher threadAttacher; + JNIEnv* env = threadAttacher.GetEnv(); + jclass cls = dmAndroid::LoadClass(env, "com.aterve.siwg.SiwgJNI"); dmLogInfo("[SIWG] InitJNI Loaded Class"); InitJNIMethods(env, cls); @@ -334,7 +333,7 @@ static void InitializeJNI(const char* client_id, bool request_server_auth_code, jmethodID jni_constructor = env->GetMethodID(cls, "", "(Landroid/app/Activity;ZZZLjava/lang/String;)V"); jstring java_client_id = env->NewStringUTF(client_id); - g_siwg.m_SiwgJNI = env->NewGlobalRef(env->NewObject(cls, jni_constructor, dmGraphics::GetNativeAndroidActivity(), true, request_server_auth_code, request_id_token, java_client_id)); + g_siwg.m_SiwgJNI = env->NewGlobalRef(env->NewObject(cls, jni_constructor, threadAttacher.GetActivity()->clazz, true, request_server_auth_code, request_id_token, java_client_id)); env->DeleteLocalRef(java_client_id); dmLogInfo("[SIWG] InitJNI JNI Refrences Initialized"); } @@ -355,7 +354,7 @@ dmExtension::Result InitializeSIWG(dmExtension::Params* params) InitializeJNI(client_id, request_server_auth_code > 0, request_id_token > 0); - dmExtension::RegisterAndroidOnActivityResultListener(OnActivityResult); + dmAndroid::RegisterOnActivityResultListener(OnActivityResult); dmLogInfo("[SIWG] Activity Result Listener Initialized"); siwg_callback_initialize(); @@ -377,7 +376,7 @@ dmExtension::Result FinalizeSIWG(dmExtension::Params* params) siwg_callback_finalize(); - dmExtension::UnregisterAndroidOnActivityResultListener(OnActivityResult); + dmAndroid::UnregisterOnActivityResultListener(OnActivityResult); dmLogInfo("[SIWG] Activity Result Listener Unregistered"); return dmExtension::RESULT_OK; diff --git a/siwg/src/siwg_callback.cpp b/siwg/src/siwg_callback.cpp index fea71a3..2138d4a 100644 --- a/siwg/src/siwg_callback.cpp +++ b/siwg/src/siwg_callback.cpp @@ -36,7 +36,7 @@ static void UnregisterCallback() } } -static void siwg_invoke_callback(MESSAGE_ID type, char*json) +static void siwg_invoke_callback(MESSAGE_ID type, const char*json) { SIWG_callback *cbk = &m_callback; if(cbk->m_Callback == LUA_NOREF) @@ -120,12 +120,12 @@ void siwg_set_callback(lua_State* L, int pos) void siwg_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); @@ -140,11 +140,15 @@ void siwg_callback_update() return; } - DM_MUTEX_SCOPED_LOCK(m_mutex); - - for(uint32_t i = 0; i != m_callbacksQueue.Size(); ++i) + dmArray tmp; { - CallbackData* data = &m_callbacksQueue[i]; + DM_MUTEX_SCOPED_LOCK(m_mutex); + tmp.Swap(m_callbacksQueue); + } + + for(uint32_t i = 0; i != tmp.Size(); ++i) + { + CallbackData* data = &tmp[i]; siwg_invoke_callback(data->msg, data->json); if(data->json) { @@ -152,6 +156,5 @@ void siwg_callback_update() data->json = 0; } } - m_callbacksQueue.SetSize(0); } #endif \ No newline at end of file