【问题标题】:QPainter JNI call crashes the applicationQPainter JNI 调用使应用程序崩溃
【发布时间】:2010-12-20 05:53:15
【问题描述】:

我想做的事 – 对用 Qt 编写的共享库进行 JNI 调用。在 C++ 方面,我使用 QPainter 和 QSvgRender 来操作 svg 图像并返回一个简单的 QImage。

QImage im;
QPainter painter;
if("image/svg+xml" == mimeType) {
    QSvgRenderer svgrenderer(ar);
    im = QImage(static_cast<int> (svgrenderer.defaultSize().width()),
                static_cast<int> (svgrenderer.defaultSize().height()),
                    QImage::Format_ARGB32);
    im = im.scaled(QSize(50,50), Qt::KeepAspectRatio);
    im.fill(0);
    painter.begin(&im);
    svgrenderer.render(&painter); //Crashes here
}

有什么问题 – 如图所示,调用渲染时代码崩溃。而且它只对某些 SVG 图像崩溃。

如果我在独立的 Qt 应用程序中运行代码,它可以正常工作。 与独立的 Qt App 相比,我没有在共享库中创建 QApplication 实例。 所以我决定以这种方式创建一个-

从 Java 主线程 - 生成另一个线程,该线程进行 JNI 调用以创建 QApplication。运行 exec()。

在 QApplication 初始化后,从 Java 主线程继续进行其他 JNI 调用。

这仍然不起作用。关于我可能做错了什么以及做我想做的事情的正确方法有什么建议? 我已经在论坛和网络上搜索了解决方案,但没有任何帮助。唯一接近我需要的线程是 - http://developer.qt.nokia.com/forums/viewthread/2283 [developer.qt.nokia.com]。

整个过程在基于 Java 的 Web 容器中运行。

【问题讨论】:

  • 你不能将Qt代码作为外部命令行工具运行吗?将 svg 作为参数并返回图像?
  • 您是否尝试过创建一个不创建 QApplication 的简单独立 Qt 应用程序?如果您在不使用 Java 的情况下让它崩溃,那就太好了。下一步是在调试器中捕获此崩溃并查看那里发生了什么。

标签: qt crash svg java-native-interface


【解决方案1】:

某种程度上解决了崩溃问题。似乎是我使用的 Java 1.5 中的一个错误 http://bugs.sun.com/view_bug.do?bug_id=5102720

我现在已经通过更改 qt 来修复它,通过为 qmake 添加这些标志来弥补堆栈重新对齐问题-

QMAKE_CFLAGS += "-mstackrealign"
QMAKE_CXXFLAGS += "-mstackrealign"

问题主要出在windows上。

【讨论】:

    猜你喜欢
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    相关资源
    最近更新 更多