【问题标题】:Creating a QMainWindow from Java using JNI使用 JNI 从 Java 创建 QMainWindow
【发布时间】:2010-05-17 05:01:40
【问题描述】:

我正在尝试直接使用 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();
    }
}

TestWindow 类:

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

public native void show();
}

C++ 实现:

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 东西执行我的“显示”方法的代码,但没有任何工作正常。

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

对此有什么想法吗?提前致谢!

埃内斯托

【问题讨论】:

    标签: java qt java-native-interface


    【解决方案1】:

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

    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 应用程序。您是否应该考虑使用 Swing 或 SWF?

    另一个建议是尝试 JNA 而不是 JNI:https://github.com/twall/jna/

    【讨论】:

      【解决方案2】:

      解决方案非常幼稚:

      不知道需要带参数启动jvm:

      -XstartOnFirstThread
      

      我做到了,一切正常。

      【讨论】:

        猜你喜欢
        • 2013-01-17
        • 1970-01-01
        • 1970-01-01
        • 2019-04-09
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 2011-01-16
        • 1970-01-01
        相关资源
        最近更新 更多