我有以下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
的原因是什么?
答案 0 :(得分:1)
我相信你可以在Java上获得一个例外#34;新的JFrame()&#34;如果你无头跑如果您在Linux中运行,那么C可能无法为Java提供带窗口系统的环境。如果您在没有连接GUI的Windows环境中运行(可能是作为服务运行的系统进程),我期望得到相同的结果。
但是,我目前在一个非常开心的Windows系统中看到了这个问题,所以我不能说这是唯一可能的原因。