FMOD+Unreal+鸿蒙系统 Cannot access Resource Manager

你好,我们现在在为项目接入鸿蒙系统,版本是 FMOD 2.3 和 UE4.27。

根据文档,在onCreate onDestroy中分别调用了 fmod.init(this) 和 fmod.close(),同时也在WindowActive、InActive下添加了对应的代码。

但是运行时无法播放声音。

Log中有 Cannot access Resource Manager 的 Warning,但加的打印显示在这条Warning之前,OnCreate 和 WindowActive 已经执行过了,所以 fmod.init() 也应该执行过才对。

可能是调用顺序或者哪里的配置有问题吗?什么会影响init?

在fmod.init()之前如果触发了声音的播放逻辑会导致init失败吗?

谢谢。

你好,感谢你提供的版本信息和代码截图!

我们目前还没有正式支持鸿蒙平台的 UE集成,请问是 UE 本身已经有鸿蒙的相关支持文档或流程了么?

这个通常和 FMOD native层初始化没有正确完成有关,如果你使用的是 logging 版本的 FMOD 的话,建议检查一下 Log 前期是否有出现 Registering FMOD module properties,如果没有这条日志的话,一般就说明 FMOD 的 native层没有成功初始化,这种情况下确实很有可能无法访问 Resource Manager。

init/close 放在 onCreate/onDestroy 是正确的,之后应该就不需要在 onWindowStageCreate 中再调用了。文档中提到的 WindowStage 主要是为了避免初始化过早,但一般情况下 UE 应该已经处理好了对应的生命周期。

是的,有这个可能。如果在 fmod.init() 之前就已经开始调用FMOD,比方说加载 bank,创建 Instance 或播放声音都有可能引发问题。

希望这些信息能帮到你们。

感谢回复,我们目前对ue做了一定程度的鸿蒙支持。现在我们去掉了onWindowStageCreate中init/close调用,还是这个问题,log中未见Registering FMOD module properties,根据你的说法,FMOD 的 native层没有成功初始化,请问这是什么原因?

感谢你的回复。

我的问题中提到的文档是 https://www.fmod.com/docs/2.03/api/platforms-openharmony.html 这篇。

logging版本的 FMOD是指打包时的配置,还是so库?我们从sales那边拿到的文件并没有标明是否是logging版本。

我的同事(lzh0715)在帖子下方提了新的问题,希望能得到解答。

你好,感谢补充的信息。

一般来说,这种情况通常是因为 FMOD 的底层本地库(.so)没有被正确加载或没有完整跑完初始化流程,所以即使调用了 fmod.init(),底层模块也没有真正启动起来。

你们也可以参考一下我们的 Android 平台文档,这里可以看到 FMOD 在这类平台上除了 init 外,还依赖平台侧的一些底层桥接初始化流程,如果这部分没有完整执行,就可能会出现类似现在这种 native 层没有初始化成功的情况。

结合你们目前是 UE 和鸿蒙的自定义适配,我们这边暂时没有完整的官方集成链路可以对照,所以确实比较难直接定位到是哪一步出了问题。

目前还是建议优先从以下方向排查:

  • FMOD 的库是否正确打包并被加载
  • 平台侧是否有类似初始化桥接流程没有执行到
  • UE 侧集成是否已经完整走到 FMOD 底层初始化逻辑

logging 版本指的是 so 库本身。

通常可以通过文件名是否带 L 来判断,例如:

  • libfmodL.so / libfmodstudioL.so就是带日志输出的 logging 版本
  • libfmod.so / libfmodstudio.so 就是 release用的 非 logging 版本

如果你们从 sales 那边拿到的库文件名称中没有 L,一般就是非 logging 版本。

如果需要更详细的日志用于排查问题,建议使用 logging 版本的库进行测试。

1 Like

初始化的问题已得到解决,解决方式是在FMOD - Platform Details | Open Harmony (resume audio on return from background)这篇文档中去除如下截图的步骤,具体机制尚不清楚

然后遇到的问题是

请问这有可能是什么原因导致?