You've already forked godot
							
							
				mirror of
				https://github.com/godotengine/godot.git
				synced 2025-11-03 11:50:27 +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_big_integers)
 | 
			
		||||
 | 
			
		||||
	print("JavaClassWrapper tests finished.")
 | 
			
		||||
	print("Tests started: " + str(_test_started))
 | 
			
		||||
	print("Tests completed: " + str(_test_completed))
 | 
			
		||||
@@ -134,3 +136,9 @@ func test_variant_conversion_safe_from_stack_overflow():
 | 
			
		||||
	arr.append(dict)
 | 
			
		||||
	# The following line will crash with stack overflow if not handled property:
 | 
			
		||||
	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
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		@JvmStatic
 | 
			
		||||
		fun testArgLong(a: Long): String {
 | 
			
		||||
			return "${a}"
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		@JvmStatic
 | 
			
		||||
		fun testArgBoolArray(a: BooleanArray): String {
 | 
			
		||||
			return a.contentToString();
 | 
			
		||||
 
 | 
			
		||||
@@ -116,16 +116,15 @@ jvalue _variant_to_jvalue(JNIEnv *env, Variant::Type p_type, const Variant *p_ar
 | 
			
		||||
		} break;
 | 
			
		||||
		case Variant::INT: {
 | 
			
		||||
			if (force_jobject) {
 | 
			
		||||
				jclass bclass = jni_find_class(env, "java/lang/Integer");
 | 
			
		||||
				jmethodID ctor = env->GetMethodID(bclass, "<init>", "(I)V");
 | 
			
		||||
				jclass bclass = jni_find_class(env, "java/lang/Long");
 | 
			
		||||
				jmethodID ctor = env->GetMethodID(bclass, "<init>", "(J)V");
 | 
			
		||||
				jvalue val;
 | 
			
		||||
				val.i = (int)(*p_arg);
 | 
			
		||||
				val.j = (jlong)(*p_arg);
 | 
			
		||||
				jobject obj = env->NewObjectA(bclass, ctor, &val);
 | 
			
		||||
				value.l = obj;
 | 
			
		||||
				env->DeleteLocalRef(bclass);
 | 
			
		||||
 | 
			
		||||
			} else {
 | 
			
		||||
				value.i = *p_arg;
 | 
			
		||||
				value.j = (jlong)(*p_arg);
 | 
			
		||||
			}
 | 
			
		||||
		} break;
 | 
			
		||||
		case Variant::FLOAT: {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user