JNI 本机接口和 JavaFX - NoClassDefFoundError
JNI Native Interface and JavaFX - NoClassDefFoundError
我有一个 bash 脚本,它使用嵌入式 JRE 启动我的程序。 此脚本有效:
#!/bin/bash
exec ./jre/bin/java \
--module-path ./jre/jfx \
--add-modules=javafx.controls,javafx.swing \
--add-opens javafx.controls/javafx.scene.control=ALL-UNNAMED \
-jar hypnos.jar "$@" --base-dir="$ROOT"
我正在尝试编写一个使用 JNI 本机接口来替换 bash 脚本的 C++ 程序。如您所见,它们向 JVM 提供相同的参数:
#include <jni.h>
int main() {
JavaVM *jvm;
JNIEnv *env;
JavaVMInitArgs vm_args;
JavaVMOption* options = new JavaVMOption[4];
options[0].optionString = (char *)"-Djava.class.path=jre/lib/server/:./hypnos.jar";
options[1].optionString = (char *)"--module-path ./jre/jfx";
options[2].optionString = (char *)"--add-modules=javafx.controls,javafx.swing";
options[3].optionString = (char *)"--add-opens javafx.controls/javafx.scene.control=ALL-UNNAMED";
vm_args.version = JNI_VERSION_10;
vm_args.nOptions = 1;
vm_args.options = options;
vm_args.ignoreUnrecognized = false;
JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
delete options;
jmethodID main = NULL;
jclass cls = NULL;
cls = env->FindClass("net/joshuad/hypnos/Hypnos");
if(env->ExceptionCheck()) {
env->ExceptionDescribe();
env->ExceptionClear();
}
if (cls != NULL) {
main = env->GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V");
} else {
printf("Unable to find the requested class\n");
}
if (main != NULL) {
env->CallStaticVoidMethod( cls, main, " ");
} else {
printf("main method not found") ;
}
jvm->DestroyJavaVM();
return 0;
}
然而,bash 脚本工作,而 C++ 程序给我:
Exception in thread "main" java.lang.NoClassDefFoundError: javafx/application/Application
带有堆栈跟踪。
我无法理解这一点,因为看起来 C++ 程序正在做与 bash 脚本正在做的相同的事情。
我有这个 C++ 程序的一个几乎相同的版本,它启动一个不依赖于 javafx 的 "hello world" java 程序,并且它可以工作。所以问题似乎是由 C++ 创建的 JVM 找不到 JavaFX。但是,我将它指向工作 bash 脚本所指向的所有相同位置,所以我不确定为什么它找不到 JavaFX。
知道如何解决这个问题吗?
这个
vm_args.nOptions = 1;
需要
vm_args.nOptions = 4;
我有一个 bash 脚本,它使用嵌入式 JRE 启动我的程序。 此脚本有效:
#!/bin/bash
exec ./jre/bin/java \
--module-path ./jre/jfx \
--add-modules=javafx.controls,javafx.swing \
--add-opens javafx.controls/javafx.scene.control=ALL-UNNAMED \
-jar hypnos.jar "$@" --base-dir="$ROOT"
我正在尝试编写一个使用 JNI 本机接口来替换 bash 脚本的 C++ 程序。如您所见,它们向 JVM 提供相同的参数:
#include <jni.h>
int main() {
JavaVM *jvm;
JNIEnv *env;
JavaVMInitArgs vm_args;
JavaVMOption* options = new JavaVMOption[4];
options[0].optionString = (char *)"-Djava.class.path=jre/lib/server/:./hypnos.jar";
options[1].optionString = (char *)"--module-path ./jre/jfx";
options[2].optionString = (char *)"--add-modules=javafx.controls,javafx.swing";
options[3].optionString = (char *)"--add-opens javafx.controls/javafx.scene.control=ALL-UNNAMED";
vm_args.version = JNI_VERSION_10;
vm_args.nOptions = 1;
vm_args.options = options;
vm_args.ignoreUnrecognized = false;
JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
delete options;
jmethodID main = NULL;
jclass cls = NULL;
cls = env->FindClass("net/joshuad/hypnos/Hypnos");
if(env->ExceptionCheck()) {
env->ExceptionDescribe();
env->ExceptionClear();
}
if (cls != NULL) {
main = env->GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V");
} else {
printf("Unable to find the requested class\n");
}
if (main != NULL) {
env->CallStaticVoidMethod( cls, main, " ");
} else {
printf("main method not found") ;
}
jvm->DestroyJavaVM();
return 0;
}
然而,bash 脚本工作,而 C++ 程序给我:
Exception in thread "main" java.lang.NoClassDefFoundError: javafx/application/Application
带有堆栈跟踪。
我无法理解这一点,因为看起来 C++ 程序正在做与 bash 脚本正在做的相同的事情。
我有这个 C++ 程序的一个几乎相同的版本,它启动一个不依赖于 javafx 的 "hello world" java 程序,并且它可以工作。所以问题似乎是由 C++ 创建的 JVM 找不到 JavaFX。但是,我将它指向工作 bash 脚本所指向的所有相同位置,所以我不确定为什么它找不到 JavaFX。
知道如何解决这个问题吗?
这个
vm_args.nOptions = 1;
需要
vm_args.nOptions = 4;