使用JNI从Java创建QMainWindow

使用JNI从Java创建QMainWindow,java,qt,java-native-interface,Java,Qt,Java Native Interface,我试图直接使用JNI从Java创建一个Qt主窗口,但遇到了一个线程错误 我的代码如下所示: 测试等级: public class Test { public static void main(String... args) { System.out.println(System.getProperty("java.library.path")); TestWindow f = new TestWindow(); f.show();

我试图直接使用JNI从Java创建一个Qt主窗口,但遇到了一个线程错误

我的代码如下所示:

测试等级:

public class Test
{
    public static void main(String... args)
    {
        System.out.println(System.getProperty("java.library.path"));
        TestWindow f = new TestWindow();
        f.show();
    }
}
测试窗口类:

public class TestWindow
{
static { System.loadLibrary("mylib"); }

public native void show();
}
C++impl:

void JNICALL Java_testpackage_TestWindow_show
  (JNIEnv *, jobject)
{
    int c = 0; char** a = NULL;
    QApplication* app = new QApplication(c, a);
    QMainWindow* mw = new QMainWindow();
    mw->setWindowTitle("Hello");
    mw->setGeometry(150, 150, 400, 300);
    mw->show();
    QApplication::exec();
}
当实例化QMainWindow对象时,我得到了绘制但冻结的窗口(它不接收任何事件)和以下错误消息:

QCoreApplication::sendPostedEvents: Cannot send posted events for objects in another thread
我知道所有的UI操作都必须在UI线程中完成,但在我的示例中,我在我运行的唯一线程中创建了QApplication,因此,所有操作都应该正常工作

我使用Qt::QueuedConnection从QMetaObject::invokeMethod的东西中执行了一些“show”方法的代码测试,但没有任何东西可以正常工作

我知道我可以用Jambi。。。但我知道这也可以在本地完成,这就是我想做的:)

有什么想法吗?提前谢谢


Ernesto

只是一个建议*:您是否应该在单独的线程中实例化本机窗口

public class Test
{
    public static void main(String... args)
    {
        System.out.println(System.getProperty("java.library.path"));
        new Thread(new Runnable() {
            public void run() {
                TestWindow f = new TestWindow();
                f.show();
            }
        }).start();
    }
}
*我从未使用本机GUI编程Java应用程序。也许你应该考虑秋千还是SWF?< /P>
另一个建议是尝试JNA而不是JNI:

只是一个建议*:您可能应该在单独的线程中实例化本机窗口

public class Test
{
    public static void main(String... args)
    {
        System.out.println(System.getProperty("java.library.path"));
        new Thread(new Runnable() {
            public void run() {
                TestWindow f = new TestWindow();
                f.show();
            }
        }).start();
    }
}
*我从未使用本机GUI编程Java应用程序。也许你应该考虑秋千还是SWF?< /P>
另一个建议是尝试JNA而不是JNI:

解决方案非常幼稚:

我不知道我需要用以下参数启动jvm:

-XstartOnFirstThread

我做到了,一切正常。

解决方案非常幼稚:

我不知道我需要用以下参数启动jvm:

-XstartOnFirstThread
我做到了,一切正常