You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C4Droid中Qt程序调用SDL_Init启动时崩溃的原因排查

SDL2与Qt集成时SDL_Init导致程序崩溃问题

我尝试将自己编写的SDL2游戏封装到Qt应用中以实现GUI控制,按照GitHub上的示例操作后程序崩溃。经排查发现是SDL_Init导致的问题。由于在C4Droid中无法查看控制台输出,调试能力受限。以下是最小复现代码:


代码文件

main.cpp

#include <QApplication>
#include <SDL2/SDL.h>

#include "SDLWin.hpp"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    
    if(SDL_Init(SDL_INIT_VIDEO) <  0)
    {
        printf("SDL failed to initialize: %s\n", SDL_GetError());
    }
    
    SDLWin win;
    win.show();
    
    int retval = app.exec();
    
    SDL_Quit();
    
    return retval;
}

SDLWin.hpp

#ifndef SDLWIN_HPP
#define SDLWIN_HPP

#include <QMainWindow>
#include <QWidget>


class SDLWin : public QMainWindow
{
    Q_OBJECT
public:
    
    SDLWin();
    ~SDLWin();
    
    void SDLInit();
private:
    QWidget      *main_win;
};

#endif

SDLWin.cpp

#include "SDLWin.hpp"
#include <QWidget>

SDLWin::SDLWin() : main_win(new QWidget)
{
    setWindowTitle("tetris");
    setCentralWidget(main_win);
}
SDLWin::~SDLWin()
{}

application.pro

QT += core uitools widgets gui

HEADERS       = ./src/SDLWin.hpp
SOURCES       = ./src/main.cpp \
                ./src/SDLWin.cpp

MOC_DIR       = ./src/moc
OBJECTS_DIR   = ./src/objects
RCC_DIR       = ./src/resource

LIBS += -lSDL2main \
        -lSDL2 \
        -lSDL2_image \
        -lSDL2_ttf \
        -lSDL2_mixer

#! [0]
RESOURCES     = application.qrc
#! [0]

# install
target.path = $$[QT_INSTALL_EXAMPLES]/widgets/mainwindows/application
INSTALLS += target

simulator: warning(This example might not fully work on Simulator platform)

解决方向

  1. 调整初始化逻辑与窗口绑定
    Qt的QApplication会接管窗口系统,SDL独立初始化视频子系统时易和Qt的窗口管理冲突。正确逻辑应该是:先创建Qt窗口,获取其原生句柄(Android平台为ANativeWindow*),再调用SDL_CreateWindowFrom绑定到该窗口,最后初始化SDL视频子系统,避免SDL独立创建窗口。

  2. 指定SDL视频驱动
    在调用SDL_Init前,强制SDL使用Android平台专属驱动,避免驱动适配问题:

    putenv("SDL_VIDEODRIVER=android");
    
  3. 替换调试输出方式
    由于C4Droid无法查看控制台,将SDL错误信息输出到Qt消息框,直接获取错误原因:

    #include <QMessageBox>
    // ...
    if(SDL_Init(SDL_INIT_VIDEO) < 0)
    {
        QString errMsg = QString("SDL初始化失败:%1").arg(SDL_GetError());
        QMessageBox::critical(nullptr, "初始化错误", errMsg);
    }
    
  4. 检查库与权限配置
    Android平台下,确保所有依赖的SDL2库文件(libSDL2.so、libSDL2_image.so等)正确放置;同时在AndroidManifest.xml中添加必要权限,如android.permission.WAKE_LOCK、android.permission.INTERNET等,适配SDL功能需求。


内容的提问来源于stack exchange,提问作者K. Russell Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 19:14:49