这是我第一个使用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中,它不起作用。有什么想法吗
1条答案
按热度按时间bkhjykvo1#
最后,我花了很多时间研究文档,解决了这个问题。由于我在网上找不到信息(这就是我创建这个问题的原因),我将在这里留下解决方案。要将参数传递给方法调用,您需要执行以下操作: