Skip to content

Commit 0db6ce1

Browse files
committed
[[ AndroidListeners ]] GlobalRef incoming jobject callback params
The global refs will be deleted after the callback handler is invoked.
1 parent 2a9d190 commit 0db6ce1

3 files changed

Lines changed: 28 additions & 17 deletions

File tree

libfoundation/src/foundation-java-private.cpp

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -467,21 +467,21 @@ static bool __MCJavaProperListFromJObjectArray(jobjectArray p_obj_array, MCPrope
467467
return MCProperListCopy(*t_list, r_list);
468468
}
469469

470-
bool MCJavaObjectCreateGlobalRef(jobject p_object, MCJavaObjectRef &r_object)
470+
void* MCJavaPrivateGlobalRef(void *p_object)
471471
{
472-
MCAssert(p_object != nullptr);
473-
void *t_obj_ptr = s_env -> NewGlobalRef(p_object);
474-
return MCJavaObjectCreate(t_obj_ptr, r_object);
472+
MCJavaDoAttachCurrentThread();
473+
jobject t_obj = static_cast<jobject>(p_object);
474+
return static_cast<void *>(s_env->NewGlobalRef(t_obj));
475475
}
476476

477-
bool MCJavaObjectCreateNullableGlobalRef(jobject p_object, MCJavaObjectRef &r_object)
477+
bool MCJavaObjectCreateNullable(jobject p_object, MCJavaObjectRef &r_object)
478478
{
479479
if (p_object == nullptr)
480480
{
481481
r_object = nullptr;
482482
return true;
483483
}
484-
return MCJavaObjectCreateGlobalRef(p_object, r_object);
484+
return MCJavaObjectCreate(p_object, r_object);
485485
}
486486

487487
static jstring MCJavaGetJObjectClassName(jobject p_obj)
@@ -567,7 +567,7 @@ static bool __JavaJNIInstanceMethodResult(jobject p_instance, jmethodID p_method
567567
s_env -> CallObjectMethodA(p_instance, p_method_id, p_params);
568568

569569
MCJavaObjectRef t_result_value;
570-
if (!MCJavaObjectCreateNullableGlobalRef(t_result, t_result_value))
570+
if (!MCJavaObjectCreateNullable(t_result, t_result_value))
571571
return false;
572572
*(static_cast<MCJavaObjectRef *>(r_result)) = t_result_value;
573573
return true;
@@ -649,7 +649,7 @@ static bool __JavaJNIStaticMethodResult(jclass p_class, jmethodID p_method_id, j
649649
s_env -> CallStaticObjectMethodA(p_class, p_method_id, p_params);
650650

651651
MCJavaObjectRef t_result_value;
652-
if (!MCJavaObjectCreateNullableGlobalRef(t_result, t_result_value))
652+
if (!MCJavaObjectCreateNullable(t_result, t_result_value))
653653
return false;
654654
*(static_cast<MCJavaObjectRef *>(r_result)) = t_result_value;
655655
return true;
@@ -731,7 +731,7 @@ static bool __JavaJNINonVirtualMethodResult(jobject p_instance, jclass p_class,
731731
s_env -> CallNonvirtualObjectMethodA(p_instance, p_class, p_method_id, p_params);
732732

733733
MCJavaObjectRef t_result_value;
734-
if (!MCJavaObjectCreateNullableGlobalRef(t_result, t_result_value))
734+
if (!MCJavaObjectCreateNullable(t_result, t_result_value))
735735
return false;
736736
*(static_cast<MCJavaObjectRef *>(r_result)) = t_result_value;
737737
return true;
@@ -813,7 +813,7 @@ static bool __JavaJNIGetFieldResult(jobject p_instance, jfieldID p_field_id, int
813813
s_env -> GetObjectField(p_instance, p_field_id);
814814

815815
MCJavaObjectRef t_result_value;
816-
if (!MCJavaObjectCreateNullableGlobalRef(t_result, t_result_value))
816+
if (!MCJavaObjectCreateNullable(t_result, t_result_value))
817817
return false;
818818
*(static_cast<MCJavaObjectRef *>(r_result)) = t_result_value;
819819
return true;
@@ -894,7 +894,7 @@ static bool __JavaJNIGetStaticFieldResult(jclass p_class, jfieldID p_field_id, i
894894
s_env -> GetStaticObjectField(p_class, p_field_id);
895895

896896
MCJavaObjectRef t_result_value;
897-
if (!MCJavaObjectCreateNullableGlobalRef(t_result, t_result_value))
897+
if (!MCJavaObjectCreateNullable(t_result, t_result_value))
898898
return false;
899899
*(static_cast<MCJavaObjectRef *>(r_result)) = t_result_value;
900900
return true;
@@ -1084,7 +1084,7 @@ static bool __JavaJNIConstructorResult(jclass p_class, jmethodID p_method_id, jv
10841084
jobject t_result = s_env -> NewObjectA(p_class, p_method_id, p_params);
10851085

10861086
MCJavaObjectRef t_result_value;
1087-
if (!MCJavaObjectCreateGlobalRef(t_result, t_result_value))
1087+
if (!MCJavaObjectCreate(t_result, t_result_value))
10881088
return false;
10891089
*(static_cast<MCJavaObjectRef *>(r_result)) = t_result_value;
10901090

@@ -1381,7 +1381,7 @@ bool MCJavaCreateInterfaceProxy(MCNameRef p_class_name, MCTypeInfoRef p_signatur
13811381
t_handler);
13821382

13831383
MCJavaObjectRef t_result_value;
1384-
if (!MCJavaObjectCreateNullableGlobalRef(t_proxy, t_result_value))
1384+
if (!MCJavaObjectCreateNullable(t_proxy, t_result_value))
13851385
return false;
13861386

13871387
*(static_cast<MCJavaObjectRef *>(r_result)) = t_result_value;
@@ -1586,7 +1586,7 @@ bool MCJavaPrivateConvertStringRefToJString(MCStringRef p_string, MCJavaObjectRe
15861586
if (!__MCJavaStringToJString(p_string, t_string))
15871587
return false;
15881588

1589-
return MCJavaObjectCreateGlobalRef(t_string, r_object);
1589+
return MCJavaObjectCreate(t_string, r_object);
15901590
}
15911591

15921592
bool MCJavaPrivateConvertJStringToStringRef(MCJavaObjectRef p_object, MCStringRef &r_string)
@@ -1601,7 +1601,7 @@ bool MCJavaPrivateConvertDataRefToJByteArray(MCDataRef p_data, MCJavaObjectRef &
16011601
if (!__MCJavaDataToJByteArray(p_data, t_array))
16021602
return false;
16031603

1604-
return MCJavaObjectCreateGlobalRef(t_array, r_object);
1604+
return MCJavaObjectCreate(t_array, r_object);
16051605
}
16061606

16071607
bool MCJavaPrivateConvertJByteArrayToDataRef(MCJavaObjectRef p_object, MCDataRef &r_data)
@@ -1844,4 +1844,9 @@ bool MCJavaPrivateGetJObjectClassName(MCJavaObjectRef p_object, MCStringRef &r_n
18441844
{
18451845
return false;
18461846
}
1847+
1848+
void* MCJavaPrivateGlobalRef(void *p_object)
1849+
{
1850+
return p_object;
1851+
}
18471852
#endif

libfoundation/src/foundation-java-private.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ void MCJavaPrivateDestroyObject(MCJavaObjectRef p_object);
6565
bool MCJavaPrivateCheckSignature(MCTypeInfoRef p_signature, MCStringRef p_args, MCStringRef p_return, int p_call_type);
6666
bool MCJavaPrivateGetJObjectClassName(MCJavaObjectRef p_object, MCStringRef &r_name);
6767

68+
void* MCJavaPrivateGlobalRef(void *p_object);
69+
6870
bool MCJavaPrivateErrorThrow(MCTypeInfoRef p_error);
6971
bool MCJavaPrivateErrorsInitialize();
7072
void MCJavaPrivateErrorsFinalize();

libfoundation/src/foundation-java.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,12 @@ MC_DLLEXPORT_DEF bool MCJavaObjectCreate(void *p_object, MCJavaObjectRef &r_obje
128128
if (!MCValueCreateCustom(kMCJavaObjectTypeInfo,
129129
sizeof(__MCJavaObjectImpl), t_obj))
130130
return false;
131-
132-
*MCJavaObjectGet(t_obj) = MCJavaObjectImplMake(p_object);
131+
132+
void *t_global_ref = nullptr;
133+
if (p_object != nullptr)
134+
t_global_ref = MCJavaPrivateGlobalRef(p_object);
135+
136+
*MCJavaObjectGet(t_obj) = MCJavaObjectImplMake(t_global_ref);
133137
r_object = t_obj;
134138

135139
return true;

0 commit comments

Comments
 (0)