You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-04 12:00:25 +00:00
Fix 64-bit integers being truncated to 32-bit in JNI
This commit is contained in:
@@ -16,6 +16,8 @@ func run_tests():
|
|||||||
|
|
||||||
__exec_test(test_variant_conversion_safe_from_stack_overflow)
|
__exec_test(test_variant_conversion_safe_from_stack_overflow)
|
||||||
|
|
||||||
|
__exec_test(test_big_integers)
|
||||||
|
|
||||||
print("JavaClassWrapper tests finished.")
|
print("JavaClassWrapper tests finished.")
|
||||||
print("Tests started: " + str(_test_started))
|
print("Tests started: " + str(_test_started))
|
||||||
print("Tests completed: " + str(_test_completed))
|
print("Tests completed: " + str(_test_completed))
|
||||||
@@ -134,3 +136,9 @@ func test_variant_conversion_safe_from_stack_overflow():
|
|||||||
arr.append(dict)
|
arr.append(dict)
|
||||||
# The following line will crash with stack overflow if not handled property:
|
# The following line will crash with stack overflow if not handled property:
|
||||||
TestClass.testDictionary(dict)
|
TestClass.testDictionary(dict)
|
||||||
|
|
||||||
|
func test_big_integers():
|
||||||
|
var TestClass: JavaClass = JavaClassWrapper.wrap('com.godot.game.test.javaclasswrapper.TestClass')
|
||||||
|
assert_equal(TestClass.testArgLong(4242424242), "4242424242")
|
||||||
|
assert_equal(TestClass.testArgLong(-4242424242), "-4242424242")
|
||||||
|
assert_equal(TestClass.testDictionary({a = 4242424242, b = -4242424242}), "{a=4242424242, b=-4242424242}")
|
||||||
|
|||||||
@@ -103,6 +103,11 @@ class TestClass {
|
|||||||
return i
|
return i
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
fun testArgLong(a: Long): String {
|
||||||
|
return "${a}"
|
||||||
|
}
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun testArgBoolArray(a: BooleanArray): String {
|
fun testArgBoolArray(a: BooleanArray): String {
|
||||||
return a.contentToString();
|
return a.contentToString();
|
||||||
|
|||||||
@@ -116,16 +116,15 @@ jvalue _variant_to_jvalue(JNIEnv *env, Variant::Type p_type, const Variant *p_ar
|
|||||||
} break;
|
} break;
|
||||||
case Variant::INT: {
|
case Variant::INT: {
|
||||||
if (force_jobject) {
|
if (force_jobject) {
|
||||||
jclass bclass = jni_find_class(env, "java/lang/Integer");
|
jclass bclass = jni_find_class(env, "java/lang/Long");
|
||||||
jmethodID ctor = env->GetMethodID(bclass, "<init>", "(I)V");
|
jmethodID ctor = env->GetMethodID(bclass, "<init>", "(J)V");
|
||||||
jvalue val;
|
jvalue val;
|
||||||
val.i = (int)(*p_arg);
|
val.j = (jlong)(*p_arg);
|
||||||
jobject obj = env->NewObjectA(bclass, ctor, &val);
|
jobject obj = env->NewObjectA(bclass, ctor, &val);
|
||||||
value.l = obj;
|
value.l = obj;
|
||||||
env->DeleteLocalRef(bclass);
|
env->DeleteLocalRef(bclass);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
value.i = *p_arg;
|
value.j = (jlong)(*p_arg);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case Variant::FLOAT: {
|
case Variant::FLOAT: {
|
||||||
|
|||||||
Reference in New Issue
Block a user