From df4597c9abf8657c16fdc4f9079e07b1684965f3 Mon Sep 17 00:00:00 2001 From: TechnoPorg Date: Sat, 22 Oct 2022 12:01:00 -0600 Subject: Improve support for 64-bit types on Android. This update mappings in the JNI functions to better support 64-bit integers, and adds support for 64-bit float arrays. The code is mostly reused from 32-bit types. --- platform/android/jni_utils.cpp | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) (limited to 'platform/android/jni_utils.cpp') diff --git a/platform/android/jni_utils.cpp b/platform/android/jni_utils.cpp index 2b0ee50570..8b29670542 100644 --- a/platform/android/jni_utils.cpp +++ b/platform/android/jni_utils.cpp @@ -148,6 +148,15 @@ jvalret _variant_to_jvalue(JNIEnv *env, Variant::Type p_type, const Variant *p_a v.val.l = arr; v.obj = arr; + } break; + case Variant::PACKED_INT64_ARRAY: { + Vector array = *p_arg; + jlongArray arr = env->NewLongArray(array.size()); + const int64_t *r = array.ptr(); + env->SetLongArrayRegion(arr, 0, array.size(), r); + v.val.l = arr; + v.obj = arr; + } break; case Variant::PACKED_BYTE_ARRAY: { Vector array = *p_arg; @@ -167,8 +176,15 @@ jvalret _variant_to_jvalue(JNIEnv *env, Variant::Type p_type, const Variant *p_a v.obj = arr; } break; + case Variant::PACKED_FLOAT64_ARRAY: { + Vector array = *p_arg; + jdoubleArray arr = env->NewDoubleArray(array.size()); + const double *r = array.ptr(); + env->SetDoubleArrayRegion(arr, 0, array.size(), r); + v.val.l = arr; + v.obj = arr; - // TODO: This is missing 64 bits arrays, I have no idea how to do it in JNI. + } break; default: { v.val.i = 0; @@ -244,6 +260,17 @@ Variant _jobject_to_variant(JNIEnv *env, jobject obj) { return sarr; } + if (name == "[J") { + jlongArray arr = (jlongArray)obj; + int fCount = env->GetArrayLength(arr); + Vector sarr; + sarr.resize(fCount); + + int64_t *w = sarr.ptrw(); + env->GetLongArrayRegion(arr, 0, fCount, w); + return sarr; + } + if (name == "[B") { jbyteArray arr = (jbyteArray)obj; int fCount = env->GetArrayLength(arr); @@ -344,12 +371,15 @@ Variant::Type get_jni_type(const String &p_type) { { "void", Variant::NIL }, { "boolean", Variant::BOOL }, { "int", Variant::INT }, + { "long", Variant::INT }, { "float", Variant::FLOAT }, { "double", Variant::FLOAT }, { "java.lang.String", Variant::STRING }, { "[I", Variant::PACKED_INT32_ARRAY }, + { "[J", Variant::PACKED_INT64_ARRAY }, { "[B", Variant::PACKED_BYTE_ARRAY }, { "[F", Variant::PACKED_FLOAT32_ARRAY }, + { "[D", Variant::PACKED_FLOAT64_ARRAY }, { "[Ljava.lang.String;", Variant::PACKED_STRING_ARRAY }, { "org.godotengine.godot.Dictionary", Variant::DICTIONARY }, { nullptr, Variant::NIL } @@ -376,13 +406,16 @@ const char *get_jni_sig(const String &p_type) { { "void", "V" }, { "boolean", "Z" }, { "int", "I" }, + { "long", "J" }, { "float", "F" }, { "double", "D" }, { "java.lang.String", "Ljava/lang/String;" }, { "org.godotengine.godot.Dictionary", "Lorg/godotengine/godot/Dictionary;" }, { "[I", "[I" }, + { "[J", "[J" }, { "[B", "[B" }, { "[F", "[F" }, + { "[D", "[D" }, { "[Ljava.lang.String;", "[Ljava/lang/String;" }, { nullptr, "V" } }; -- cgit v1.2.3