java - JNI native 接口(interface)和 JavaFX - NoClassDefFoundError

标签 java java-native-interface jnienv

我有一个 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 native 接口(interface)的 C++ 程序来替换该 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++ 程序给我: 线程“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/

相关文章:

java - Spark 获取嵌套 json 的列名

java - java中文件加载完成检查

Java正则表达式导致线程挂起

c++ - jbyteArray 是一个 jobject(即 : as a parameter to DeleteLocalRef)?

c# - Xamarin.Android : The call is ambiguous between the following methods or properties

java - 如何修复此 UnknownHostException?

java - 如何使用 JNI 传递和接收对象

windows-7 - NetBeans Development 7 - Windows 7 64 位……JNI 原生调用……一个如何指导

android - 从其他 jni 库调用 jni 方法

java - JNI 加载具有依赖项的 jar