从JNI调用main()入口点时,新的JFrame()崩溃

时间:2013-08-14 16:35:21

标签: java java-native-interface

我有以下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")等添加到JNI代码中,它就能够找到该类并创建它而不会出现问题。此外,如果我在Java中创建一些“内置”类,如String,它就会成功。

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

1 个答案:

答案 0 :(得分:1)

我相信你可以在Java上获得一个例外#34;新的JFrame()&#34;如果你无头跑如果您在Linux中运行,那么C可能无法为Java提供带窗口系统的环境。如果您在没有连接GUI的Windows环境中运行(可能是作为服务运行的系统进程),我期望得到相同的结果。

但是,我目前在一个非常开心的Windows系统中看到了这个问题,所以我不能说这是唯一可能的原因。