Skip to content

Commit bb5c32a

Browse files
committed
Merge pull request #112192 from limbonaut/fix/jni-32bit-integers
Fix 64-bit integers being truncated to 32-bit in JNI
2 parents 250ef8d + b0cb297 commit bb5c32a

File tree

3 files changed

+17
-5
lines changed

3 files changed

+17
-5
lines changed

platform/android/java/app/src/instrumented/assets/test/javaclasswrapper/java_class_wrapper_tests.gd

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ func run_tests():
1616

1717
__exec_test(test_variant_conversion_safe_from_stack_overflow)
1818

19+
__exec_test(test_big_integers)
20+
1921
print("JavaClassWrapper tests finished.")
2022
print("Tests started: " + str(_test_started))
2123
print("Tests completed: " + str(_test_completed))
@@ -134,3 +136,9 @@ func test_variant_conversion_safe_from_stack_overflow():
134136
arr.append(dict)
135137
# The following line will crash with stack overflow if not handled property:
136138
TestClass.testDictionary(dict)
139+
140+
func test_big_integers():
141+
var TestClass: JavaClass = JavaClassWrapper.wrap('com.godot.game.test.javaclasswrapper.TestClass')
142+
assert_equal(TestClass.testArgLong(4242424242), "4242424242")
143+
assert_equal(TestClass.testArgLong(-4242424242), "-4242424242")
144+
assert_equal(TestClass.testDictionary({a = 4242424242, b = -4242424242}), "{a=4242424242, b=-4242424242}")

platform/android/java/app/src/instrumented/java/com/godot/game/test/javaclasswrapper/TestClass.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,11 @@ class TestClass {
103103
return i
104104
}
105105

106+
@JvmStatic
107+
fun testArgLong(a: Long): String {
108+
return "${a}"
109+
}
110+
106111
@JvmStatic
107112
fun testArgBoolArray(a: BooleanArray): String {
108113
return a.contentToString();

platform/android/jni_utils.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -116,16 +116,15 @@ jvalue _variant_to_jvalue(JNIEnv *env, Variant::Type p_type, const Variant *p_ar
116116
} break;
117117
case Variant::INT: {
118118
if (force_jobject) {
119-
jclass bclass = jni_find_class(env, "java/lang/Integer");
120-
jmethodID ctor = env->GetMethodID(bclass, "<init>", "(I)V");
119+
jclass bclass = jni_find_class(env, "java/lang/Long");
120+
jmethodID ctor = env->GetMethodID(bclass, "<init>", "(J)V");
121121
jvalue val;
122-
val.i = (int)(*p_arg);
122+
val.j = (jlong)(*p_arg);
123123
jobject obj = env->NewObjectA(bclass, ctor, &val);
124124
value.l = obj;
125125
env->DeleteLocalRef(bclass);
126-
127126
} else {
128-
value.i = *p_arg;
127+
value.j = (jlong)(*p_arg);
129128
}
130129
} break;
131130
case Variant::FLOAT: {

0 commit comments

Comments
 (0)