2010-12-20 5 views
2

무엇을하려고합니까 - Qt로 작성된 공유 라이브러리에 대한 JNI 호출을 만듭니다. C++ 측에서는 QPainter와 QSvgRender를 사용하여 svg 이미지를 조작하고 간단한 QImage를 반환합니다. 같이 렌더링 호출하는 동안 코드 충돌 - 문제를 무엇QPainter JNI 호출이 응용 프로그램을 크래시합니다.

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 인스턴스를 만들지 않았습니다. 그래서이 방법을 만들려고 결정했습니다.

자바 메인 스레드로부터 - QApplication을 생성하기 위해 JNI 호출을하는 다른 스레드를 생성하십시오. exec()를 실행합니다.

Java 주 스레드에서 QApplication이 초기화 된 후에 다른 JNI 호출을 계속 수행합니다.

여전히 작동하지 않습니다. 내가 잘못하고있는 일에 대해 조언하고 내가하려는 일을 올바르게 수행하는 방법은 무엇입니까? 포럼과 웹에서 해결책을 찾았지만 아무 것도 도움이되지 않았습니다. 내가 필요로하는 것에 가까운 유일한 스레드는 - http://developer.qt.nokia.com/forums/viewthread/2283 [developer.qt.nokia.com]입니다.

모든 것은 자바 기반 웹 컨테이너에서 실행됩니다.

+0

외부 명령 줄 도구로 Qt 코드를 실행할 수 없습니까? 인수로 svg를 가져 와서 이미지를 반환합니까? –

+0

QApplication을 만들지 않는 간단한 독립 실행 형 Qt 응용 프로그램을 만들려고 했습니까? Java를 사용하지 않고 충돌이 발생하면 좋을 것입니다. 다음 단계는 디버거에서이 크래시를 잡아서 무슨 일이 있었는지 확인하는 것입니다. –

답변

1

종류의 충돌 문제가 해결되었습니다. qmake-

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

문제에 대한 이러한 플래그를 추가하여 스택 재배치 문제를 만회하기 위해 내가 QT를 변경하여 http://bugs.sun.com/view_bug.do?bug_id=5102720

나는 지금 그것을 해결 한 사용하던 자바 1.5에서 버그가 수 있도록 듯 주로 창문에 있었다.

관련 문제