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)
#include <dmsdk/dlib/android.h>
#include <string.h>
#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, "<init>", "(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;

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;
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<CallbackData> 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