Unreal 4.23.1打包Android APK时ffmpeg的SO文件未嵌入引发崩溃求助
问题分析与解决方案
你的核心问题是Android平台下未将FFmpeg的SO文件标记为运行时依赖,导致Unreal打包APK时不会自动复制这些SO到安装包中,运行时找不到库就崩溃。以下是修改后的Build.cs Android分支代码及关键说明:
修改后的Android平台配置代码
else if (Target.Platform == UnrealTargetPlatform.Android) { // Android 使用的 SO 文件,这里假设你只处理armeabi-v7a,若有其他ABI需扩展 string AndroidAbi = "armeabi-v7a"; string AndroidLibrariesPath = Path.Combine(LibrariesPath, "android", AndroidAbi); // 添加库文件搜索路径,让链接器能找到SO PublicAdditionalLibraryPaths.Add(AndroidLibrariesPath); // 引用编译时需要的SO库 PublicAdditionalLibraries.Add(Path.Combine(AndroidLibrariesPath, "libavcodec.so")); PublicAdditionalLibraries.Add(Path.Combine(AndroidLibrariesPath, "libavformat.so")); PublicAdditionalLibraries.Add(Path.Combine(AndroidLibrariesPath, "libavutil.so")); PublicAdditionalLibraries.Add(Path.Combine(AndroidLibrariesPath, "libswresample.so")); PublicAdditionalLibraries.Add(Path.Combine(AndroidLibrariesPath, "libswscale.so")); // 关键:将SO文件标记为运行时依赖,指定打包到APK的对应ABI目录 string[] SoNames = { "libavcodec.so", "libavformat.so", "libavutil.so", "libswresample.so", "libswscale.so" }; foreach (string SoName in SoNames) { string SourceSoPath = Path.Combine(AndroidLibrariesPath, SoName); // 目标路径格式:lib/[ABI]/xxx.so,Unreal会自动将其打包到APK的对应位置 string TargetSoPath = Path.Combine("lib", AndroidAbi, SoName); RuntimeDependencies.Add(TargetSoPath, SourceSoPath, StagedFileType.NonUFS); } // 这里修改为动态加载 OnlineSubsystemGooglePlay DynamicallyLoadedModuleNames.Add("OnlineSubsystemGooglePlay"); // 可能还需要保留对其他模块的私有依赖 PrivateDependencyModuleNames.Add("OnlineSubsystem"); //PrivateDependencyModuleNames.Add("AndroidAdvertising"); }
关键改动说明
- 添加库搜索路径:通过
PublicAdditionalLibraryPaths告诉Unreal构建工具去哪里找Android的SO库,避免链接时找不到文件。 - 标记运行时依赖:使用
RuntimeDependencies.Add明确指定SO文件的来源和打包后的目标路径,Unreal会在打包时自动将这些SO复制到APK的lib/armeabi-v7a/目录下,这是Android加载动态库的标准路径。 - 统一处理SO文件:用数组循环添加依赖,避免重复代码,也方便后续扩展其他ABI(比如arm64-v8a)。
额外检查项
- 确认你的FFmpeg SO文件是针对Android armeabi-v7a架构编译的,不要用Linux或其他平台的SO文件。
- 如果需要支持多ABI(比如arm64-v8a),可以根据
Target.Architecture动态获取当前编译的ABI,替换硬编码的AndroidAbi值,比如:string AndroidAbi = Target.Architecture; // 自动获取当前架构,如armeabi-v7a、arm64-v8a等
内容的提问来源于stack exchange,提问作者user1875144
相关产品推荐
相关产品推荐

