java - JNI Rust 如何将参数传递给 call_static_method?

标签 java rust java-native-interface

这是我使用 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 中它不起作用。有什么想法吗?

最佳答案

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

// 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/

相关文章:

javascript - 在 J2V8 中使用 promise

java - 为什么 Java 中的每个对象都隐式扩展 java.lang.Object 类?

rust - "borrowed value does not live long enough"trie插入错误

rust - 如何在不知 Prop 体IP版本的情况下创建 `IpAddr`?

rust - 为什么这个右值没有提升为引用中指定的左值?

Java 回调到 C++ 从 C++ 回调

c++ - ReleaseStringUTFChars 给出 free() : invalid pointer: 0x0841a744 ***

java - 如何在 Android 中查找名称以特定字符串开头的文件夹中的文件

java - 像在android收件箱中一样通过短信制作聊天页面

java - Java中的修饰符关键字顺序