1

我有以下 Java 程序(OpenJDK6、FreeBSD 9.1):

package test;
import javax.swing.JFrame;

public final class Application 
{
  private void go1()
  {
    JFrame x = new JFrame();
  }

  public static void main(String[] args) 
  {
    new Application().go1();
  }
}   

我编写了一个简单的 C++ 程序来初始化 JVM 并调用Application.main()

#include <jni.h>
#include <iostream>

int main()
{
  JavaVM *jvm;
  JNIEnv *env;
  JavaVMInitArgs vm_args;
  JavaVMOption* options = new JavaVMOption[1];
  options[0].optionString = "-Djava.class.path=my/path1:my/path2";
  vm_args.version = JNI_VERSION_1_6;
  vm_args.nOptions = 1;
  vm_args.options = options;
  vm_args.ignoreUnrecognized = false;
  JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args);
  jclass cls = env->FindClass("test/Application");
  jmethodID method = env->GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V");
  jobject arr = env->NewObjectArray(0, str, 0);
  env->CallStaticVoidMethod(cls, method, arr);
  char ch;
  std::cin >> ch;
}

在我运行上面的 C++ 程序的地方,它成功地找到了Application类并调用了main方法,但是随后我在行遇到了JFrame x = new JFrame()段错误(为了便于阅读,我省略了跟踪行,比如std::cout << "I'm here"System.out.println("Here we are"))。

如果我将env->FindClass("javax/swing/JFrame")etc 添加到 JNI 代码中,它能够找到该类并毫无问题地创建它。此外,如果我在 Java 中创建一些“内置”类,例如String,它会成功。

JFrame那么,Java 代码无法在从 JNI 启动的主线程中创建的原因可能是什么?

4

1 回答 1

1

如果您无头运行,我相信您可以在“new JFrame()”上从 Java 中获得异常。如果您在 Linux 中运行,那么 C 可能不会为 Java 提供带有窗口系统的环境。如果您在没有附加 GUI 的 Windows 环境中运行(可能是作为服务运行的系统进程),我希望得到相同的结果。

然而,我目前在一个其他快乐的 Windows 系统中看到了这个问题,所以我不能说这是唯一可能的原因。

于 2017-10-30T19:00:49.553 回答