繁体   English   中英

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具有堆栈跟踪的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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM