JNI 箱子。如何将 -XstartOnFirstThread 选项传递给 jvm?

问题描述 投票:0回答:1

我需要在 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.

我花了几个小时在谷歌上搜索答案并阅读文档,但我仍然找不到答案,有人遇到过这个问题或有任何想法吗?

rust java-native-interface
1个回答
0
投票

经过一番调查,发现

-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 并执行其他操作。

© www.soinside.com 2019 - 2024. All rights reserved.