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") }
排查与修复步骤
修正JNI_OnLoad中的类查找逻辑
崩溃根源是FindClass找不到对应Java类,需确认:- 类名需使用全限定名(包含包名,例如
org.home.koogel.SDLActivity),且与JNI代码中的路径格式一致(用/替换.) - 自定义SDLActivity需正确继承SDL3的基类,包名与JNI中查找的类名完全匹配
- 类名需使用全限定名(包含包名,例如
完善SDL3的项目依赖配置
当前build.gradle仅读取了SDL3路径,但未将其作为模块引入项目:- 在
settings.gradle中添加SDL3模块:include ':SDL3' project(':SDL3').projectDir = new File(sdl3Dir, 'android/app') - 在app模块的build.gradle中添加依赖:
dependencies { implementation project(':SDL3') // 其他自定义库依赖 }
- 在
调整库加载顺序
确保SDL3库优先于自定义库加载,避免依赖缺失:protected String[] getLibraries() { return new String[] { "c++_shared", "SDL3", "loader", "image_engine", "image" }; }(当前顺序已符合要求,额外确认APK的
lib/x86_64目录下是否存在所有声明的.so文件)验证SDL3库的构建正确性
- 确保使用的是SDL3针对Android平台构建的库,而非桌面版本。进入SDL3的
android目录,执行./gradlew assembleDebug重新构建,再通过模块依赖引用生成的库 - 检查测试设备/emulator的架构是否与构建的库一致(当前为x86_64)
- 确保使用的是SDL3针对Android平台构建的库,而非桌面版本。进入SDL3的
修复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
相关产品推荐
相关产品推荐

