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
相关产品推荐
相关产品推荐

