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

SDL3游戏移植Android启动崩溃问题求助

SDL3 Android移植启动崩溃问题排查与解决

问题概述

将SDL3游戏移植到Android平台,应用可正常构建,但启动后立即崩溃。Logcat关键错误显示崩溃发生在libSDL3.so的JNI_OnLoad阶段,核心触发点为FindClass调用失败,最终引发SIGABRT信号。

关键Log片段:

runtime.cc:699]     in call to FindClass
runtime.cc:699]     from java.lang.String java.lang.Runtime.nativeLoad(java.lang.String, java.lang.ClassLoader, java.lang.Class)
2023-07-03 20:15:55.504 20280-20280 libc                    org.home.koogel                      A  Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 20280 (SDLActivity), pid 20280 (SDLActivity)
...
#11 pc 000000000023c1f6  /data/app/~~N53rLpZY9mh-E3GtGYnN6Q==/org.home.koogel-igXmQKQnrfbvP2nKt24nXg==/lib/x86_64/libSDL3.so (JNI_OnLoad+182)

现有配置

SDLActivity代码

protected String[] getLibraries() {
    return new String[] {
        "c++_shared",
        "SDL3",
        "loader",
        "image_engine",
        "image"
    };
}

local.properties配置

sdk.dir=/home/koogel/Android/Sdk
sdl3.dir=/home/koogel/SDL/
cmake.dir =/usr/

build.gradle相关代码

//adding of the SDL3 directory
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
def sdl3Dir = properties.getProperty('sdl3.dir')
if (sdl3Dir == null)
{
    throw new IllegalArgumentException("no [sdl3.dir] property in [local.properties] file")
}

排查与修复步骤

  1. 修正JNI_OnLoad中的类查找逻辑
    崩溃根源是FindClass找不到对应Java类,需确认:

    • 类名需使用全限定名(包含包名,例如org.home.koogel.SDLActivity),且与JNI代码中的路径格式一致(用/替换.)
    • 自定义SDLActivity需正确继承SDL3的基类,包名与JNI中查找的类名完全匹配
  2. 完善SDL3的项目依赖配置
    当前build.gradle仅读取了SDL3路径,但未将其作为模块引入项目:

    • 在settings.gradle中添加SDL3模块:
      include ':SDL3'
      project(':SDL3').projectDir = new File(sdl3Dir, 'android/app')
      
    • 在app模块的build.gradle中添加依赖:
      dependencies {
          implementation project(':SDL3')
          // 其他自定义库依赖
      }
      
  3. 调整库加载顺序
    确保SDL3库优先于自定义库加载,避免依赖缺失:

    protected String[] getLibraries() {
        return new String[] {
            "c++_shared",
            "SDL3",
            "loader",
            "image_engine",
            "image"
        };
    }
    

    (当前顺序已符合要求,额外确认APK的lib/x86_64目录下是否存在所有声明的.so文件)

  4. 验证SDL3库的构建正确性

    • 确保使用的是SDL3针对Android平台构建的库,而非桌面版本。进入SDL3的android目录,执行./gradlew assembleDebug重新构建,再通过模块依赖引用生成的库
    • 检查测试设备/emulator的架构是否与构建的库一致(当前为x86_64)
  5. 修复JNI环境的类加载逻辑
    若自定义了JNI代码,需确保在JNI_OnLoad中使用正确的类加载器查找Activity类:

    JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) {
        JNIEnv* env = NULL;
        if (vm->GetEnv((void**)&env, JNI_VERSION_1_6) != JNI_OK) {
            return JNI_ERR;
        }
        // 使用全限定类名(/分隔包名)
        jclass activityClass = env->FindClass("org/home/koogel/SDLActivity");
        if (activityClass == NULL) {
            return JNI_ERR;
        }
        // 后续初始化逻辑
        return JNI_VERSION_1_6;
    }
    

额外提示

  • 从SDL2迁移到SDL3时,注意JNI接口的兼容性差异,避免复用旧版本的JNI代码
  • 使用Android Studio的Profile工具查看完整崩溃调用栈,定位具体缺失的类名

内容的提问来源于stack exchange,提问作者koogel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 02:17:23