|
@@ -90,61 +90,44 @@ String charsequence_to_string(JNIEnv *p_env, jobject p_charsequence) {
|
|
|
return result;
|
|
return result;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-jvalue _variant_to_jvalue(JNIEnv *env, Variant::Type p_type, const Variant *p_arg, bool force_jobject, int p_depth) {
|
|
|
|
|
- jvalue value;
|
|
|
|
|
|
|
+jobject _variant_to_jobject(JNIEnv *env, Variant::Type p_type, const Variant *p_arg, int p_depth) {
|
|
|
|
|
+ jobject ret = nullptr;
|
|
|
|
|
|
|
|
if (p_depth > Variant::MAX_RECURSION_DEPTH) {
|
|
if (p_depth > Variant::MAX_RECURSION_DEPTH) {
|
|
|
ERR_PRINT("Variant is too deep! Bailing.");
|
|
ERR_PRINT("Variant is too deep! Bailing.");
|
|
|
- value.i = 0;
|
|
|
|
|
- return value;
|
|
|
|
|
|
|
+ return ret;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
env->PushLocalFrame(2);
|
|
env->PushLocalFrame(2);
|
|
|
switch (p_type) {
|
|
switch (p_type) {
|
|
|
case Variant::BOOL: {
|
|
case Variant::BOOL: {
|
|
|
- if (force_jobject) {
|
|
|
|
|
- jclass bclass = jni_find_class(env, "java/lang/Boolean");
|
|
|
|
|
- jmethodID ctor = env->GetMethodID(bclass, "<init>", "(Z)V");
|
|
|
|
|
- jvalue val;
|
|
|
|
|
- val.z = (bool)(*p_arg);
|
|
|
|
|
- jobject obj = env->NewObjectA(bclass, ctor, &val);
|
|
|
|
|
- value.l = obj;
|
|
|
|
|
- env->DeleteLocalRef(bclass);
|
|
|
|
|
- } else {
|
|
|
|
|
- value.z = *p_arg;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ jclass bclass = jni_find_class(env, "java/lang/Boolean");
|
|
|
|
|
+ jmethodID ctor = env->GetMethodID(bclass, "<init>", "(Z)V");
|
|
|
|
|
+ jvalue val;
|
|
|
|
|
+ val.z = (bool)(*p_arg);
|
|
|
|
|
+ ret = env->NewObjectA(bclass, ctor, &val);
|
|
|
|
|
+ env->DeleteLocalRef(bclass);
|
|
|
} break;
|
|
} break;
|
|
|
case Variant::INT: {
|
|
case Variant::INT: {
|
|
|
- if (force_jobject) {
|
|
|
|
|
- jclass bclass = jni_find_class(env, "java/lang/Long");
|
|
|
|
|
- jmethodID ctor = env->GetMethodID(bclass, "<init>", "(J)V");
|
|
|
|
|
- jvalue val;
|
|
|
|
|
- val.j = (jlong)(*p_arg);
|
|
|
|
|
- jobject obj = env->NewObjectA(bclass, ctor, &val);
|
|
|
|
|
- value.l = obj;
|
|
|
|
|
- env->DeleteLocalRef(bclass);
|
|
|
|
|
- } else {
|
|
|
|
|
- value.j = (jlong)(*p_arg);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ jclass bclass = jni_find_class(env, "java/lang/Long");
|
|
|
|
|
+ jmethodID ctor = env->GetMethodID(bclass, "<init>", "(J)V");
|
|
|
|
|
+ jvalue val;
|
|
|
|
|
+ val.j = (jlong)(*p_arg);
|
|
|
|
|
+ ret = env->NewObjectA(bclass, ctor, &val);
|
|
|
|
|
+ env->DeleteLocalRef(bclass);
|
|
|
} break;
|
|
} break;
|
|
|
case Variant::FLOAT: {
|
|
case Variant::FLOAT: {
|
|
|
- if (force_jobject) {
|
|
|
|
|
- jclass bclass = jni_find_class(env, "java/lang/Double");
|
|
|
|
|
- jmethodID ctor = env->GetMethodID(bclass, "<init>", "(D)V");
|
|
|
|
|
- jvalue val;
|
|
|
|
|
- val.d = (double)(*p_arg);
|
|
|
|
|
- jobject obj = env->NewObjectA(bclass, ctor, &val);
|
|
|
|
|
- value.l = obj;
|
|
|
|
|
- env->DeleteLocalRef(bclass);
|
|
|
|
|
-
|
|
|
|
|
- } else {
|
|
|
|
|
- value.f = *p_arg;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ jclass bclass = jni_find_class(env, "java/lang/Double");
|
|
|
|
|
+ jmethodID ctor = env->GetMethodID(bclass, "<init>", "(D)V");
|
|
|
|
|
+ jvalue val;
|
|
|
|
|
+ val.d = (double)(*p_arg);
|
|
|
|
|
+ ret = env->NewObjectA(bclass, ctor, &val);
|
|
|
|
|
+ env->DeleteLocalRef(bclass);
|
|
|
} break;
|
|
} break;
|
|
|
case Variant::STRING: {
|
|
case Variant::STRING: {
|
|
|
String s = *p_arg;
|
|
String s = *p_arg;
|
|
|
jstring jStr = env->NewStringUTF(s.utf8().get_data());
|
|
jstring jStr = env->NewStringUTF(s.utf8().get_data());
|
|
|
- value.l = jStr;
|
|
|
|
|
|
|
+ ret = jStr;
|
|
|
} break;
|
|
} break;
|
|
|
case Variant::PACKED_STRING_ARRAY: {
|
|
case Variant::PACKED_STRING_ARRAY: {
|
|
|
Vector<String> sarray = *p_arg;
|
|
Vector<String> sarray = *p_arg;
|
|
@@ -155,13 +138,12 @@ jvalue _variant_to_jvalue(JNIEnv *env, Variant::Type p_type, const Variant *p_ar
|
|
|
env->SetObjectArrayElement(arr, j, str);
|
|
env->SetObjectArrayElement(arr, j, str);
|
|
|
env->DeleteLocalRef(str);
|
|
env->DeleteLocalRef(str);
|
|
|
}
|
|
}
|
|
|
- value.l = arr;
|
|
|
|
|
-
|
|
|
|
|
|
|
+ ret = arr;
|
|
|
} break;
|
|
} break;
|
|
|
|
|
|
|
|
case Variant::CALLABLE: {
|
|
case Variant::CALLABLE: {
|
|
|
jobject jcallable = callable_to_jcallable(env, *p_arg);
|
|
jobject jcallable = callable_to_jcallable(env, *p_arg);
|
|
|
- value.l = jcallable;
|
|
|
|
|
|
|
+ ret = jcallable;
|
|
|
} break;
|
|
} break;
|
|
|
|
|
|
|
|
case Variant::DICTIONARY: {
|
|
case Variant::DICTIONARY: {
|
|
@@ -189,10 +171,10 @@ jvalue _variant_to_jvalue(JNIEnv *env, Variant::Type p_type, const Variant *p_ar
|
|
|
|
|
|
|
|
for (int j = 0; j < keys.size(); j++) {
|
|
for (int j = 0; j < keys.size(); j++) {
|
|
|
Variant var = dict[keys[j]];
|
|
Variant var = dict[keys[j]];
|
|
|
- jvalue valret = _variant_to_jvalue(env, var.get_type(), &var, true, p_depth + 1);
|
|
|
|
|
- env->SetObjectArrayElement(jvalues, j, valret.l);
|
|
|
|
|
- if (valret.l) {
|
|
|
|
|
- env->DeleteLocalRef(valret.l);
|
|
|
|
|
|
|
+ jobject jvar = _variant_to_jobject(env, var.get_type(), &var, p_depth + 1);
|
|
|
|
|
+ env->SetObjectArrayElement(jvalues, j, jvar);
|
|
|
|
|
+ if (jvar) {
|
|
|
|
|
+ env->DeleteLocalRef(jvar);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -202,7 +184,7 @@ jvalue _variant_to_jvalue(JNIEnv *env, Variant::Type p_type, const Variant *p_ar
|
|
|
env->DeleteLocalRef(jvalues);
|
|
env->DeleteLocalRef(jvalues);
|
|
|
env->DeleteLocalRef(dclass);
|
|
env->DeleteLocalRef(dclass);
|
|
|
|
|
|
|
|
- value.l = jdict;
|
|
|
|
|
|
|
+ ret = jdict;
|
|
|
} break;
|
|
} break;
|
|
|
|
|
|
|
|
case Variant::ARRAY: {
|
|
case Variant::ARRAY: {
|
|
@@ -211,13 +193,13 @@ jvalue _variant_to_jvalue(JNIEnv *env, Variant::Type p_type, const Variant *p_ar
|
|
|
|
|
|
|
|
for (int j = 0; j < array.size(); j++) {
|
|
for (int j = 0; j < array.size(); j++) {
|
|
|
Variant var = array[j];
|
|
Variant var = array[j];
|
|
|
- jvalue valret = _variant_to_jvalue(env, var.get_type(), &var, true, p_depth + 1);
|
|
|
|
|
- env->SetObjectArrayElement(arr, j, valret.l);
|
|
|
|
|
- if (valret.l) {
|
|
|
|
|
- env->DeleteLocalRef(valret.l);
|
|
|
|
|
|
|
+ jobject jvar = _variant_to_jobject(env, var.get_type(), &var, p_depth + 1);
|
|
|
|
|
+ env->SetObjectArrayElement(arr, j, jvar);
|
|
|
|
|
+ if (jvar) {
|
|
|
|
|
+ env->DeleteLocalRef(jvar);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- value.l = arr;
|
|
|
|
|
|
|
+ ret = arr;
|
|
|
} break;
|
|
} break;
|
|
|
|
|
|
|
|
case Variant::PACKED_INT32_ARRAY: {
|
|
case Variant::PACKED_INT32_ARRAY: {
|
|
@@ -225,57 +207,50 @@ jvalue _variant_to_jvalue(JNIEnv *env, Variant::Type p_type, const Variant *p_ar
|
|
|
jintArray arr = env->NewIntArray(array.size());
|
|
jintArray arr = env->NewIntArray(array.size());
|
|
|
const int *r = array.ptr();
|
|
const int *r = array.ptr();
|
|
|
env->SetIntArrayRegion(arr, 0, array.size(), r);
|
|
env->SetIntArrayRegion(arr, 0, array.size(), r);
|
|
|
- value.l = arr;
|
|
|
|
|
-
|
|
|
|
|
|
|
+ ret = arr;
|
|
|
} break;
|
|
} break;
|
|
|
case Variant::PACKED_INT64_ARRAY: {
|
|
case Variant::PACKED_INT64_ARRAY: {
|
|
|
Vector<int64_t> array = *p_arg;
|
|
Vector<int64_t> array = *p_arg;
|
|
|
jlongArray arr = env->NewLongArray(array.size());
|
|
jlongArray arr = env->NewLongArray(array.size());
|
|
|
const int64_t *r = array.ptr();
|
|
const int64_t *r = array.ptr();
|
|
|
env->SetLongArrayRegion(arr, 0, array.size(), r);
|
|
env->SetLongArrayRegion(arr, 0, array.size(), r);
|
|
|
- value.l = arr;
|
|
|
|
|
-
|
|
|
|
|
|
|
+ ret = arr;
|
|
|
} break;
|
|
} break;
|
|
|
case Variant::PACKED_BYTE_ARRAY: {
|
|
case Variant::PACKED_BYTE_ARRAY: {
|
|
|
Vector<uint8_t> array = *p_arg;
|
|
Vector<uint8_t> array = *p_arg;
|
|
|
jbyteArray arr = env->NewByteArray(array.size());
|
|
jbyteArray arr = env->NewByteArray(array.size());
|
|
|
const uint8_t *r = array.ptr();
|
|
const uint8_t *r = array.ptr();
|
|
|
env->SetByteArrayRegion(arr, 0, array.size(), reinterpret_cast<const signed char *>(r));
|
|
env->SetByteArrayRegion(arr, 0, array.size(), reinterpret_cast<const signed char *>(r));
|
|
|
- value.l = arr;
|
|
|
|
|
-
|
|
|
|
|
|
|
+ ret = arr;
|
|
|
} break;
|
|
} break;
|
|
|
case Variant::PACKED_FLOAT32_ARRAY: {
|
|
case Variant::PACKED_FLOAT32_ARRAY: {
|
|
|
Vector<float> array = *p_arg;
|
|
Vector<float> array = *p_arg;
|
|
|
jfloatArray arr = env->NewFloatArray(array.size());
|
|
jfloatArray arr = env->NewFloatArray(array.size());
|
|
|
const float *r = array.ptr();
|
|
const float *r = array.ptr();
|
|
|
env->SetFloatArrayRegion(arr, 0, array.size(), r);
|
|
env->SetFloatArrayRegion(arr, 0, array.size(), r);
|
|
|
- value.l = arr;
|
|
|
|
|
-
|
|
|
|
|
|
|
+ ret = arr;
|
|
|
} break;
|
|
} break;
|
|
|
case Variant::PACKED_FLOAT64_ARRAY: {
|
|
case Variant::PACKED_FLOAT64_ARRAY: {
|
|
|
Vector<double> array = *p_arg;
|
|
Vector<double> array = *p_arg;
|
|
|
jdoubleArray arr = env->NewDoubleArray(array.size());
|
|
jdoubleArray arr = env->NewDoubleArray(array.size());
|
|
|
const double *r = array.ptr();
|
|
const double *r = array.ptr();
|
|
|
env->SetDoubleArrayRegion(arr, 0, array.size(), r);
|
|
env->SetDoubleArrayRegion(arr, 0, array.size(), r);
|
|
|
- value.l = arr;
|
|
|
|
|
-
|
|
|
|
|
|
|
+ ret = arr;
|
|
|
} break;
|
|
} break;
|
|
|
case Variant::OBJECT: {
|
|
case Variant::OBJECT: {
|
|
|
Ref<JavaObject> generic_object = *p_arg;
|
|
Ref<JavaObject> generic_object = *p_arg;
|
|
|
if (generic_object.is_valid()) {
|
|
if (generic_object.is_valid()) {
|
|
|
jobject obj = env->NewLocalRef(generic_object->get_instance());
|
|
jobject obj = env->NewLocalRef(generic_object->get_instance());
|
|
|
- value.l = obj;
|
|
|
|
|
- } else {
|
|
|
|
|
- value.i = 0;
|
|
|
|
|
|
|
+ ret = obj;
|
|
|
}
|
|
}
|
|
|
} break;
|
|
} break;
|
|
|
|
|
|
|
|
- default: {
|
|
|
|
|
- value.i = 0;
|
|
|
|
|
- } break;
|
|
|
|
|
|
|
+ // Add default to prevent compiler warning about not handling all types.
|
|
|
|
|
+ default:
|
|
|
|
|
+ break;
|
|
|
}
|
|
}
|
|
|
- value.l = env->PopLocalFrame(value.l);
|
|
|
|
|
- return value;
|
|
|
|
|
|
|
+
|
|
|
|
|
+ return env->PopLocalFrame(ret);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
String _get_class_name(JNIEnv *env, jclass cls, bool *array) {
|
|
String _get_class_name(JNIEnv *env, jclass cls, bool *array) {
|