JNI Rust如何传递参数到call_static_method?

yeotifhr  于 2023-05-29  发布在  其他
关注(0)|答案(1)|浏览(174)

这是我第一个使用jni的项目。
我正在尝试从Rust调用一个Java方法。
Java方法签名看起来像这样:

public static void main(String[] args) {...}

在Rust方面,我创建了一个JavaVM,找到类并尝试调用静态方法,但我不知道如何传递参数

env.call_static_method(class, "main", "([Ljava/lang/String;)V", HowPassArgumentsThere?)
.expect("Failed to invoke main method");

参数是一个字符串数组,因为我理解它。我必须写上这样的话:

[
“—username”, “Test”,
“—version”, “1.7.10”,
“—uuid”, “4f19c3577b774731bcc663e536ebd108”, 
“—accessToken”, “12412412412”,
“—userProperties”, “{}”
]

完整代码可在这里:https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=03c197068218a00b3e0a2d8f170dda16
我试图创建一个对象数组根据它是如何在cpp中完成

jobjectArray str_array = Env->NewObjectArray(Env, 4, Env->FindClass(Env, 'java/lang/String'), Env->NewString(Env, NULL, 0));
Arguments[0] = '--username';
Arguments[1] = 'Player';
Arguments[2] = '--accessToken';
Arguments[3] = '12345';
Env->SetObjectArrayElement(Env, JavaObjectArray, 0, Env->NewString(Env, &Arguments[0]), strlen(Arguments[0]));
Env->SetObjectArrayElement(Env, JavaObjectArray, 1, Env->NewString(Env, &Arguments[1]), strlen(Arguments[1]));
Env->SetObjectArrayElement(Env, JavaObjectArray, 2, Env->NewString(Env, &Arguments[2]), strlen(Arguments[2]));
Env->SetObjectArrayElement(Env, JavaObjectArray, 3, Env->NewString(Env, &Arguments[3]), strlen(Arguments[3]));

env->CallStaticVoidMethod(class_Launch, env->GetStaticMethodID(class_Launch, "main", "([Ljava/lang/String;)V"), str_array);
jvm->DestroyJavaVM();

但在Rust中,它不起作用。有什么想法吗

bkhjykvo

bkhjykvo1#

最后,我花了很多时间研究文档,解决了这个问题。由于我在网上找不到信息(这就是我创建这个问题的原因),我将在这里留下解决方案。要将参数传递给方法调用,您需要执行以下操作:

// create Java array of objects (in our case, type string)
// 1 - one element of array
// stringClass - Java string class signature ("java/lang/String")
// env.new_string("") - initial element of array
let arguments: JObjectArray = env.new_object_array(1, stringClass, env.new_string("").unwrap()).unwrap();

// Set element at index 0
// &arguments - reference to our Java objects array
// 0 - element index (place at)
// env.new_string("--username") - the value we set at 0 index (create new java string)
env.set_object_array_element(&arguments, 0, env.new_string("--username").unwrap()).unwrap();

// JValue - This type is used for parameters passed to Java method calls.
// A reference JValueGen
// docs:  
// https://docs.rs/jni/latest/jni/objects/enum.JValueGen.html#
// https://docs.rs/jni/latest/jni/objects/type.JValue.html
//
// &JObject::from(arguments) - create Java object instance from our arguments object array
// 
env.call_static_method(class,main_method_name, main_signature, &[JValue::Object(&JObject::from(arguments))])

相关问题