我有以下 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 启动的主线程中创建的原因可能是什么?