Собственный интерфейс JNI и JavaFX - NoClassDefFoundError - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть скрипт 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"

Я пытаюсь написать программу на C ++, использующую собственный интерфейс JNI для замены этого сценария bash.Как видите, они предоставляют идентичные аргументы 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 ++, которая запускает Java-программу «Hello World», которая не зависит от javafx, и она работает.Таким образом, проблема заключается в том, что созданная C ++ JVM не может найти JavaFX.Тем не менее, я указываю на те же места, на которые указывает рабочий скрипт bash, поэтому я не уверен, почему он не может найти JavaFX.

Есть идеи, как решить эту проблему?

1 Ответ

0 голосов
/ 26 ноября 2018

Это

vm_args.nOptions = 1;

должно быть

vm_args.nOptions = 4;
...