updated to use new API methods & smaller mutex handling

This commit is contained in:
Nick Leeman 2022-08-11 18:48:49 +02:00
parent 2d4639ae8a
commit 5db59bc645
2 changed files with 29 additions and 27 deletions

View File

@ -7,10 +7,12 @@
#if defined(DM_PLATFORM_ANDROID) #if defined(DM_PLATFORM_ANDROID)
#include <dmsdk/dlib/android.h>
#include <string.h> #include <string.h>
#include "siwg.h" #include "siwg.h"
#include "siwg_jni.h" // #include "siwg_jni.h"
#include "siwg_callback.h" #include "siwg_callback.h"
#include "com_aterve_siwg_SiwgJNI.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() // void method()
static int CallVoidMethod(jobject instance, jmethodID method) static int CallVoidMethod(jobject instance, jmethodID method)
{ {
ThreadAttacher attacher; dmAndroid::ThreadAttacher threadAttacher;
JNIEnv *env = attacher.env; JNIEnv* env = threadAttacher.GetEnv();
env->CallVoidMethod(instance, method); env->CallVoidMethod(instance, method);
return 0; return 0;
} }
@ -106,8 +108,9 @@ static int CallVoidMethod(jobject instance, jmethodID method)
static int CallStringMethod(lua_State* L, jobject instance, jmethodID method) static int CallStringMethod(lua_State* L, jobject instance, jmethodID method)
{ {
DM_LUA_STACK_CHECK(L, 1); DM_LUA_STACK_CHECK(L, 1);
ThreadAttacher attacher; dmAndroid::ThreadAttacher threadAttacher;
JNIEnv *env = attacher.env; JNIEnv* env = threadAttacher.GetEnv();
jstring return_value = (jstring)env->CallObjectMethod(instance, method); jstring return_value = (jstring)env->CallObjectMethod(instance, method);
if (return_value) 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) static int CallBooleanMethod(lua_State* L, jobject instance, jmethodID method)
{ {
DM_LUA_STACK_CHECK(L, 1); DM_LUA_STACK_CHECK(L, 1);
ThreadAttacher attacher; dmAndroid::ThreadAttacher threadAttacher;
JNIEnv *env = attacher.env; JNIEnv* env = threadAttacher.GetEnv();
jboolean return_value = (jboolean)env->CallBooleanMethod(instance, method); jboolean return_value = (jboolean)env->CallBooleanMethod(instance, method);
lua_pushboolean(L, JNI_TRUE == return_value); lua_pushboolean(L, JNI_TRUE == return_value);
return 1; return 1;
@ -219,12 +222,9 @@ static int SiwgAuth_set_callback(lua_State* L)
// JNI Extension Methods // 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; env->CallVoidMethod(g_siwg.m_SiwgJNI, g_siwg.m_activityResult, request_code, result_code, result);
JNIEnv *_env = attacher.env;
_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) 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); CheckInitializationParams(client_id, request_server_auth_code > 0, request_id_token > 0);
dmLogInfo("[SIWG] InitJNI Checked Params"); dmLogInfo("[SIWG] InitJNI Checked Params");
ThreadAttacher attacher; dmAndroid::ThreadAttacher threadAttacher;
JNIEnv *env = attacher.env; JNIEnv* env = threadAttacher.GetEnv();
ClassLoader class_loader = ClassLoader(env); jclass cls = dmAndroid::LoadClass(env, "com.aterve.siwg.SiwgJNI");
jclass cls = class_loader.load("com.aterve.siwg.SiwgJNI");
dmLogInfo("[SIWG] InitJNI Loaded Class"); dmLogInfo("[SIWG] InitJNI Loaded Class");
InitJNIMethods(env, cls); 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, "<init>", "(Landroid/app/Activity;ZZZLjava/lang/String;)V"); jmethodID jni_constructor = env->GetMethodID(cls, "<init>", "(Landroid/app/Activity;ZZZLjava/lang/String;)V");
jstring java_client_id = env->NewStringUTF(client_id); 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); env->DeleteLocalRef(java_client_id);
dmLogInfo("[SIWG] InitJNI JNI Refrences Initialized"); 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); InitializeJNI(client_id, request_server_auth_code > 0, request_id_token > 0);
dmExtension::RegisterAndroidOnActivityResultListener(OnActivityResult); dmAndroid::RegisterOnActivityResultListener(OnActivityResult);
dmLogInfo("[SIWG] Activity Result Listener Initialized"); dmLogInfo("[SIWG] Activity Result Listener Initialized");
siwg_callback_initialize(); siwg_callback_initialize();
@ -377,7 +376,7 @@ dmExtension::Result FinalizeSIWG(dmExtension::Params* params)
siwg_callback_finalize(); siwg_callback_finalize();
dmExtension::UnregisterAndroidOnActivityResultListener(OnActivityResult); dmAndroid::UnregisterOnActivityResultListener(OnActivityResult);
dmLogInfo("[SIWG] Activity Result Listener Unregistered"); dmLogInfo("[SIWG] Activity Result Listener Unregistered");
return dmExtension::RESULT_OK; return dmExtension::RESULT_OK;

View File

@ -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; SIWG_callback *cbk = &m_callback;
if(cbk->m_Callback == LUA_NOREF) 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) void siwg_add_to_queue(MESSAGE_ID msg, const char*json)
{ {
DM_MUTEX_SCOPED_LOCK(m_mutex);
CallbackData data; CallbackData data;
data.msg = msg; data.msg = msg;
data.json = json ? strdup(json) : NULL; data.json = json ? strdup(json) : NULL;
DM_MUTEX_SCOPED_LOCK(m_mutex);
if(m_callbacksQueue.Full()) if(m_callbacksQueue.Full())
{ {
m_callbacksQueue.OffsetCapacity(1); m_callbacksQueue.OffsetCapacity(1);
@ -140,11 +140,15 @@ void siwg_callback_update()
return; return;
} }
DM_MUTEX_SCOPED_LOCK(m_mutex); dmArray<CallbackData> tmp;
for(uint32_t i = 0; i != m_callbacksQueue.Size(); ++i)
{ {
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); siwg_invoke_callback(data->msg, data->json);
if(data->json) if(data->json)
{ {
@ -152,6 +156,5 @@ void siwg_callback_update()
data->json = 0; data->json = 0;
} }
} }
m_callbacksQueue.SetSize(0);
} }
#endif #endif