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

Android Studio JNI项目如何强制CMake先构建SDL2再编译SDL_mixer_X

CMake 依赖构建顺序问题解决方案

核心思路

无需修改SDL2、SDL_mixer_X自带的不可修改的CMakeLists文件,通过显式声明目标依赖即可强制构建顺序。

方案1:显式添加目标依赖(推荐)

SDL2构建完成后会导出名为SDL2::SDL2的官方目标,SDL_mixer_X的顶层构建目标通常为SDL_mixer_X,其依赖的libtimidity-sdl目标名为libtimidity-sdl。
在你jni/CMakeLists.txt的所有add_subdirectory语句后新增如下配置即可:

# 强制SDL_mixer_X依赖SDL2,必须等SDL2构建完成后再构建SDL_mixer_X
add_dependencies(SDL_mixer_X SDL2::SDL2)
# 强制SDL_mixer_X的依赖项也依赖SDL2,避免嵌套依赖构建报错
add_dependencies(libtimidity-sdl SDL2::SDL2)

该方案不影响并行编译速度,完全适配原生第三方CMake配置。

方案2:强制单线程编译(备用)

如果无法确认第三方库的目标名,可以在Android Studio的Gradle配置中强制CMake单线程编译,严格按照add_subdirectory的声明顺序构建:
打开app模块的build.gradle,修改cmake配置如下:

android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                // 其余原有参数保留,新增-j1参数强制单线程构建
                arguments "-j1"
            }
        }
    }
}

该方案无需修改CMake配置,缺点是编译速度会有所下降。

补充修正点

你当前jni/src/CMakeLists.txt中存在语法错误:target_link_library需要补全末尾的s,正确写法为target_link_libraries。
另外推荐链接SDL官方导出的命名空间目标,稳定性更高:

target_link_libraries(app SDL2::SDL2 SDL2::SDL_mixer)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:45:05