这是我使用 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”, “{}”
]
我尝试根据 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 中它不起作用。有什么想法吗?
最佳答案
最后。我通过花费大量时间研究文档解决了这个问题。由于我在网上找不到信息(这就是我创建问题的原因),我将把解决方案留在这里。 要将参数传递给方法调用,您需要执行以下操作:
// 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))])
关于java - JNI Rust 如何将参数传递给 call_static_method?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76307885/