gpt4 book ai didi

java - 使用 JNI 从 Java 创建 QMainWindow

转载 作者:太空宇宙 更新时间:2023-11-04 08:53:29 26 4
gpt4 key购买 nike

我尝试直接使用 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++ 实现:

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”方法的代码,但没有任何效果正常。

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

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

埃内斯托

最佳答案

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

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();
}
}

*我从未使用 native GUI 编写过 Java 应用程序。也许您应该考虑使用 Swing 或 SWF?

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

关于java - 使用 JNI 从 Java 创建 QMainWindow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2846756/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com