30
30
31
31
#include " api/java_class_wrapper.h"
32
32
33
- #include " string_android .h"
33
+ #include " jni_utils .h"
34
34
#include " thread_jandroid.h"
35
35
36
36
bool JavaClass::_call_method (JavaObject *p_instance, const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error, Variant &ret) {
@@ -96,11 +96,17 @@ bool JavaClass::_call_method(JavaObject *p_instance, const StringName &p_method,
96
96
arg_expected = Variant::FLOAT;
97
97
}
98
98
} break ;
99
- case ARG_TYPE_STRING: {
99
+ case ARG_TYPE_STRING:
100
+ case ARG_TYPE_CHARSEQUENCE: {
100
101
if (!p_args[i]->is_string ()) {
101
102
arg_expected = Variant::STRING;
102
103
}
103
104
} break ;
105
+ case ARG_TYPE_CALLABLE: {
106
+ if (p_args[i]->get_type () != Variant::CALLABLE) {
107
+ arg_expected = Variant::CALLABLE;
108
+ }
109
+ } break ;
104
110
case ARG_TYPE_CLASS: {
105
111
if (p_args[i]->get_type () != Variant::OBJECT && p_args[i]->get_type () != Variant::NIL) {
106
112
arg_expected = Variant::OBJECT;
@@ -265,12 +271,18 @@ bool JavaClass::_call_method(JavaObject *p_instance, const StringName &p_method,
265
271
argv[i].l = obj;
266
272
to_free.push_back (obj);
267
273
} break ;
268
- case ARG_TYPE_STRING: {
274
+ case ARG_TYPE_STRING:
275
+ case ARG_TYPE_CHARSEQUENCE: {
269
276
String s = *p_args[i];
270
277
jstring jStr = env->NewStringUTF (s.utf8 ().get_data ());
271
278
argv[i].l = jStr;
272
279
to_free.push_back (jStr);
273
280
} break ;
281
+ case ARG_TYPE_CALLABLE: {
282
+ jobject jcallable = callable_to_jcallable (env, *p_args[i]);
283
+ argv[i].l = jcallable;
284
+ to_free.push_back (jcallable);
285
+ } break ;
274
286
case ARG_TYPE_CLASS: {
275
287
Ref<JavaObject> jo = *p_args[i];
276
288
if (jo.is_valid ()) {
@@ -367,7 +379,8 @@ bool JavaClass::_call_method(JavaObject *p_instance, const StringName &p_method,
367
379
to_free.push_back (a);
368
380
369
381
} break ;
370
- case ARG_ARRAY_BIT | ARG_TYPE_STRING: {
382
+ case ARG_ARRAY_BIT | ARG_TYPE_STRING:
383
+ case ARG_ARRAY_BIT | ARG_TYPE_CHARSEQUENCE: {
371
384
Array arr = *p_args[i];
372
385
jobjectArray a = env->NewObjectArray (arr.size (), env->FindClass (" java/lang/String" ), nullptr );
373
386
for (int j = 0 ; j < arr.size (); j++) {
@@ -380,6 +393,19 @@ bool JavaClass::_call_method(JavaObject *p_instance, const StringName &p_method,
380
393
argv[i].l = a;
381
394
to_free.push_back (a);
382
395
} break ;
396
+ case ARG_ARRAY_BIT | ARG_TYPE_CALLABLE: {
397
+ Array arr = *p_args[i];
398
+ jobjectArray jarr = env->NewObjectArray (arr.size (), env->FindClass (" org/godotengine/godot/variant/Callable" ), nullptr );
399
+ for (int j = 0 ; j < arr.size (); j++) {
400
+ Variant callable = arr[j];
401
+ jobject jcallable = callable_to_jcallable (env, callable);
402
+ env->SetObjectArrayElement (jarr, j, jcallable);
403
+ to_free.push_back (jcallable);
404
+ }
405
+
406
+ argv[i].l = jarr;
407
+ to_free.push_back (jarr);
408
+ } break ;
383
409
case ARG_ARRAY_BIT | ARG_TYPE_CLASS: {
384
410
argv[i].l = nullptr ;
385
411
} break ;
@@ -463,7 +489,7 @@ bool JavaClass::_call_method(JavaObject *p_instance, const StringName &p_method,
463
489
default : {
464
490
jobject obj;
465
491
if (method->_constructor ) {
466
- obj = env->NewObject (_class, method->method , argv);
492
+ obj = env->NewObjectA (_class, method->method , argv);
467
493
} else if (method->_static ) {
468
494
obj = env->CallStaticObjectMethodA (_class, method->method , argv);
469
495
} else {
@@ -491,6 +517,15 @@ bool JavaClass::_call_method(JavaObject *p_instance, const StringName &p_method,
491
517
return success;
492
518
}
493
519
520
+ bool JavaClass::_get (const StringName &p_name, Variant &r_ret) const {
521
+ if (constant_map.has (p_name)) {
522
+ r_ret = constant_map[p_name];
523
+ return true ;
524
+ }
525
+
526
+ return false ;
527
+ }
528
+
494
529
Variant JavaClass::callp (const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error) {
495
530
Variant ret;
496
531
@@ -706,6 +741,12 @@ bool JavaClassWrapper::_get_type_sig(JNIEnv *env, jobject obj, uint32_t &sig, St
706
741
} else if (str_type == " java.lang.String" ) {
707
742
t |= JavaClass::ARG_TYPE_STRING;
708
743
strsig += " Ljava/lang/String;" ;
744
+ } else if (str_type == " java.lang.CharSequence" ) {
745
+ t |= JavaClass::ARG_TYPE_CHARSEQUENCE;
746
+ strsig += " Ljava/lang/CharSequence;" ;
747
+ } else if (str_type == " org.godotengine.godot.variant.Callable" ) {
748
+ t |= JavaClass::ARG_TYPE_CALLABLE;
749
+ strsig += " Lorg/godotengine/godot/variant/Callable;" ;
709
750
} else if (str_type == " java.lang.Boolean" ) {
710
751
t |= JavaClass::ARG_TYPE_BOOLEAN | JavaClass::ARG_NUMBER_CLASS_BIT;
711
752
strsig += " Ljava/lang/Boolean;" ;
@@ -793,6 +834,14 @@ bool JavaClass::_convert_object_to_variant(JNIEnv *env, jobject obj, Variant &va
793
834
var = jstring_to_string ((jstring)obj, env);
794
835
return true ;
795
836
} break ;
837
+ case ARG_TYPE_CHARSEQUENCE: {
838
+ var = charsequence_to_string (env, obj);
839
+ return true ;
840
+ } break ;
841
+ case ARG_TYPE_CALLABLE: {
842
+ var = jcallable_to_callable (env, obj);
843
+ return true ;
844
+ } break ;
796
845
case ARG_TYPE_CLASS: {
797
846
jclass java_class = env->GetObjectClass (obj);
798
847
Ref<JavaClass> java_class_wrapped = JavaClassWrapper::singleton->wrap_jclass (java_class);
@@ -1113,6 +1162,44 @@ bool JavaClass::_convert_object_to_variant(JNIEnv *env, jobject obj, Variant &va
1113
1162
var = ret;
1114
1163
return true ;
1115
1164
} break ;
1165
+ case ARG_ARRAY_BIT | ARG_TYPE_CHARSEQUENCE: {
1166
+ Array ret;
1167
+ jobjectArray arr = (jobjectArray)obj;
1168
+
1169
+ int count = env->GetArrayLength (arr);
1170
+
1171
+ for (int i = 0 ; i < count; i++) {
1172
+ jobject o = env->GetObjectArrayElement (arr, i);
1173
+ if (!o) {
1174
+ ret.push_back (Variant ());
1175
+ } else {
1176
+ String val = charsequence_to_string (env, o);
1177
+ ret.push_back (val);
1178
+ }
1179
+ env->DeleteLocalRef (o);
1180
+ }
1181
+
1182
+ var = ret;
1183
+ return true ;
1184
+ } break ;
1185
+ case ARG_ARRAY_BIT | ARG_TYPE_CALLABLE: {
1186
+ Array ret;
1187
+ jobjectArray jarr = (jobjectArray)obj;
1188
+ int count = env->GetArrayLength (jarr);
1189
+ for (int i = 0 ; i < count; i++) {
1190
+ jobject o = env->GetObjectArrayElement (jarr, i);
1191
+ if (!o) {
1192
+ ret.push_back (Variant ());
1193
+ } else {
1194
+ Callable callable = jcallable_to_callable (env, o);
1195
+ ret.push_back (callable);
1196
+ }
1197
+ env->DeleteLocalRef (o);
1198
+ }
1199
+
1200
+ var = ret;
1201
+ return true ;
1202
+ } break ;
1116
1203
case ARG_ARRAY_BIT | ARG_TYPE_CLASS: {
1117
1204
} break ;
1118
1205
}
0 commit comments