QPainter JNI 调用导致应用程序崩溃

发布于 2024-10-08 13:52:14 字数 1164 浏览 1 评论 0原文

我想做的事情 – 对用 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 应用程序相比,我没有在共享库中创建 QApplication 实例。 因此,我决定以这种方式创建一个 -

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

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

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

整个过程在基于 java 的 Web 容器内运行。

What I am trying to do – Make a JNI call to a shared library written in Qt. On the C++ side I am using QPainter and QSvgRender to manipulate an svg image and return a simple 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
}

What is the issue
The code crashes while calling render as shown. And it crashes only for certain SVG images.

If I run the code within a stand alone Qt Application, it works fine.
I hadn’t created a QApplication instance within my shared lib as against a stand alone Qt App.
So I decided to create one this way-

From Java Main Thread – Spawn another thread which makes a JNI call to create a QApplication. Runs exec().

From Java Main Thread continue to make other JNI calls after the QApplication is initialized.

This still doesn’t work. Any advise on what I may be doing wrong and what is the right way to do what I am trying to do?
I have searched the forum and the web for solutions but nothing has helped. The only thread that came close to what I need is – http://developer.qt.nokia.com/forums/viewthread/2283 [developer.qt.nokia.com].

The whole thing runs inside a java based web container.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

林空鹿饮溪 2024-10-15 13:52:14

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

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

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

问题主要出现在 Windows 上。

Kind of solved the crashing issue. Seemed to be a bug in Java 1.5 that I was using https://bugs.java.com/bugdatabase/view_bug?bug_id=5102720

I have fixed it for now by changing qt to make up for the stack realignment issue by adding these flags for qmake-

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

The problem was mainly on windows.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文