我有一个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;

关于java - JNI native 接口(interface)和JavaFX-NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53457524/

10-14 10:07