diff options
Diffstat (limited to 'platform/android/api')
-rw-r--r-- | platform/android/api/api.cpp | 30 | ||||
-rw-r--r-- | platform/android/api/java_class_wrapper.h | 49 | ||||
-rw-r--r-- | platform/android/api/jni_singleton.h | 5 |
3 files changed, 76 insertions, 8 deletions
diff --git a/platform/android/api/api.cpp b/platform/android/api/api.cpp index 60c369951c..6920f801e5 100644 --- a/platform/android/api/api.cpp +++ b/platform/android/api/api.cpp @@ -49,6 +49,7 @@ void register_android_api() { #endif GDREGISTER_CLASS(JavaClass); + GDREGISTER_CLASS(JavaObject); GDREGISTER_CLASS(JavaClassWrapper); Engine::get_singleton()->add_singleton(Engine::Singleton("JavaClassWrapper", JavaClassWrapper::get_singleton())); } @@ -59,6 +60,16 @@ void unregister_android_api() { #endif } +void JavaClass::_bind_methods() { + ClassDB::bind_method(D_METHOD("get_java_class_name"), &JavaClass::get_java_class_name); + ClassDB::bind_method(D_METHOD("get_java_method_list"), &JavaClass::get_java_method_list); + ClassDB::bind_method(D_METHOD("get_java_parent_class"), &JavaClass::get_java_parent_class); +} + +void JavaObject::_bind_methods() { + ClassDB::bind_method(D_METHOD("get_java_class"), &JavaObject::get_java_class); +} + void JavaClassWrapper::_bind_methods() { ClassDB::bind_method(D_METHOD("wrap", "name"), &JavaClassWrapper::wrap); } @@ -69,13 +80,32 @@ Variant JavaClass::callp(const StringName &, const Variant **, int, Callable::Ca return Variant(); } +String JavaClass::get_java_class_name() const { + return ""; +} + +TypedArray<Dictionary> JavaClass::get_java_method_list() const { + return TypedArray<Dictionary>(); +} + +Ref<JavaClass> JavaClass::get_java_parent_class() const { + return Ref<JavaClass>(); +} + JavaClass::JavaClass() { } +JavaClass::~JavaClass() { +} + Variant JavaObject::callp(const StringName &, const Variant **, int, Callable::CallError &) { return Variant(); } +Ref<JavaClass> JavaObject::get_java_class() const { + return Ref<JavaClass>(); +} + JavaClassWrapper *JavaClassWrapper::singleton = nullptr; Ref<JavaClass> JavaClassWrapper::wrap(const String &) { diff --git a/platform/android/api/java_class_wrapper.h b/platform/android/api/java_class_wrapper.h index e21a331ab9..52df1644be 100644 --- a/platform/android/api/java_class_wrapper.h +++ b/platform/android/api/java_class_wrapper.h @@ -32,6 +32,7 @@ #define JAVA_CLASS_WRAPPER_H #include "core/object/ref_counted.h" +#include "core/variant/typed_array.h" #ifdef ANDROID_ENABLED #include <android/log.h> @@ -67,6 +68,7 @@ class JavaClass : public RefCounted { struct MethodInfo { bool _static = false; + bool _constructor = false; Vector<uint32_t> param_types; Vector<StringName> param_sigs; uint32_t return_type = 0; @@ -174,14 +176,29 @@ class JavaClass : public RefCounted { bool _call_method(JavaObject *p_instance, const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error, Variant &ret); friend class JavaClassWrapper; + friend class JavaObject; + String java_class_name; + String java_constructor_name; HashMap<StringName, List<MethodInfo>> methods; jclass _class; #endif +protected: + static void _bind_methods(); + public: virtual Variant callp(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error) override; + String get_java_class_name() const; + TypedArray<Dictionary> get_java_method_list() const; + Ref<JavaClass> get_java_parent_class() const; + +#ifdef ANDROID_ENABLED + virtual String to_string() override; +#endif + JavaClass(); + ~JavaClass(); }; class JavaObject : public RefCounted { @@ -191,14 +208,24 @@ class JavaObject : public RefCounted { Ref<JavaClass> base_class; friend class JavaClass; - jobject instance; + jobject instance = nullptr; #endif +protected: + static void _bind_methods(); + public: virtual Variant callp(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error) override; + Ref<JavaClass> get_java_class() const; + #ifdef ANDROID_ENABLED - JavaObject(const Ref<JavaClass> &p_base, jobject *p_instance); + virtual String to_string() override; + + jobject get_instance() { return instance; } + + JavaObject(); + JavaObject(const Ref<JavaClass> &p_base, jobject p_instance); ~JavaObject(); #endif }; @@ -209,13 +236,17 @@ class JavaClassWrapper : public Object { #ifdef ANDROID_ENABLED RBMap<String, Ref<JavaClass>> class_cache; friend class JavaClass; - jmethodID getDeclaredMethods; - jmethodID getFields; - jmethodID getParameterTypes; - jmethodID getReturnType; - jmethodID getModifiers; - jmethodID getName; + jmethodID Class_getDeclaredConstructors; + jmethodID Class_getDeclaredMethods; + jmethodID Class_getFields; jmethodID Class_getName; + jmethodID Class_getSuperclass; + jmethodID Constructor_getParameterTypes; + jmethodID Constructor_getModifiers; + jmethodID Method_getParameterTypes; + jmethodID Method_getReturnType; + jmethodID Method_getModifiers; + jmethodID Method_getName; jmethodID Field_getName; jmethodID Field_getModifiers; jmethodID Field_get; @@ -242,6 +273,8 @@ public: Ref<JavaClass> wrap(const String &p_class); #ifdef ANDROID_ENABLED + Ref<JavaClass> wrap_jclass(jclass p_class); + JavaClassWrapper(jobject p_activity = nullptr); #else JavaClassWrapper(); diff --git a/platform/android/api/jni_singleton.h b/platform/android/api/jni_singleton.h index 087fd1bace..06afc4eb78 100644 --- a/platform/android/api/jni_singleton.h +++ b/platform/android/api/jni_singleton.h @@ -180,6 +180,11 @@ public: env->DeleteLocalRef(obj); } break; + case Variant::OBJECT: { + jobject obj = env->CallObjectMethodA(instance, E->get().method, v); + ret = _jobject_to_variant(env, obj); + env->DeleteLocalRef(obj); + } break; default: { env->PopLocalFrame(nullptr); ERR_FAIL_V(Variant()); |