我需要在 JavaVM 参数中添加“-XstartOnFirstThread”选项,以便在 MacO 上显示 GUI(如果没有此选项,应用程序启动时不会出现错误,但不会显示 GUI)。在 Linux 和 Windows 上,如果没有此选项,一切都可以正常工作。仅 MacO 需要它。 当我将其添加到选项列表时,出现错误:
Unrecognized option: -XstartOnFirstThread
thread 'main' panicked at src/main.rs:39:6:
Failed to create JavaVM: Create(JniCall(Unknown))
如何将其添加到JVM?毕竟,如果没有它,我的应用程序将无法在 MacO 上正常工作(未创建应用程序窗口)
我用来初始化和启动 JVM 的代码:
let jvm_args = InitArgsBuilder::new()
.version(JNIVersion::V8)
.option("-XstartOnFirstThread") // This option need for run GUI on MacOs
//Classpath with natives skipped
.build()
.unwrap();
let jvm = JavaVM::new(jvm_args)
.expect("Failed to create JavaVM");
let mut env = jvm
.attach_current_thread()
.expect("Failed to attach JNIEnv");
//Java class find and invoke static method Main skipped.
我花了几个小时在谷歌上搜索答案并阅读文档,但我仍然找不到答案,有人遇到过这个问题或有任何想法吗?
经过一番调查,发现
-XstartOnFirstThread
是在名为“libjli”的东西中实现的,而不是libjvm。 java
可执行文件链接到 libjli,而 rust-jni 通常使用 libjvm。
你可以尝试的是
JavaVM::with_libjvm(jvm_args, || OsString::new("/path/to/libjli.dylib")
。或者,您可以自己加载 libjli.dylib
并自己调用它的 CreateJavaVM
函数。
但是,这会导致第二个问题:在主线程上运行 JVM 将永远不会返回到 Rust。 因此,您需要确保从主 Java 类调用 Rust,或者有第二个线程随时准备连接到 JVM 并执行其他操作。