HarmonyOS鸿蒙Next中XComponent组件的onLoad事件不触发,使用xComponentController.getXComponentContext()拿到的是undefind

HarmonyOS鸿蒙Next中XComponent组件的onLoad事件不触发,使用xComponentController.getXComponentContext()拿到的是undefind cke_453.png

如图所示:XComponent组件与ijkPlayer三方库联合使用时,onLoad事件拿到的数据对象是undefind。甚至是不触发回调。使用xComponentController.getXComponentContext()拿到的也是undefind

cke_6290.png

我下载使用远程三方库时,该onLoad事件拿到的数据对象是正确的。但是现在我使用ijkplayer源码自己编译的ijkPlayer.har的静态包时,就会出现上述的这个问题。考虑是自己编译的ijkPlayer的har包有问题。但是我就是将ffmpeg,yuv这些库编译好,按照他的仓库给的教程一步一步编译的har包。并且源码我也是用的clone而不是直接下载的源码。现在出现这个问题,我不知道错误的点到底是什么?我该怎么排查这个问题?

因为我做的工作其实就是将ijkplayer需要使用的库编译好放到指定位置然后编译成har包,并没有改动一行代码。

cke_83847.png

PS:附上日志一份


更多关于HarmonyOS鸿蒙Next中XComponent组件的onLoad事件不触发,使用xComponentController.getXComponentContext()拿到的是undefind的实战教程也可以访问 https://www.itying.com/category-93-b0.html

10 回复

开发者您好,这边使用ohpm install @ohos/ijkplayer拿到就可以不是undefind这样是吗?这边看下git clone的ijkplayer版本和ohpm install的ijkplayer的版本是不是一致的呢?如果一致的话麻烦提供下可复现的demo,麻烦也把这边做好的ijkplayer含有ffmpeg,yuv这些库的demo提供下。

更多关于HarmonyOS鸿蒙Next中XComponent组件的onLoad事件不触发,使用xComponentController.getXComponentContext()拿到的是undefind的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


开发者你好,经确认,该问题为编译的依赖动态库有问题,加载动态库失败了,麻烦按照readme文档中的步骤重新编译依赖库:

https://gitcode.com/openharmony-sig/ohos_ijkplayer/blob/master/README_zh.md#%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C

你说的对,我git clone下来的版本是2.0.8.但是ohpm install的三方库是2.0.7的。可能和这个有关系,我更换一下版本试试,

更换到与远程三方库同版本后一样不行,我无法提供做好的ijkplayer,因为他的大小超过了100MB,我无法将这个做好的三方库源码提供给你。甚至连复现demo我都无法提供给你,因为使用了har包后大小超过了100MB,

hilog日志

我也出现过为undefined,当时我记得好像是编译的架构不对

架构这个倒是有可能,ijkplayer库里面设置的架构是arm64-v8a和x86_64。但是我只编译了arm64-v8a架构的ffmpeg这些。所以我把源码里面的x86_64注释掉了。但是我运行使用这个ijkplayer静态包的设备就是arm64的,

为XComponent组件设置明确的宽高后,onLoad能够被触发了。但是拿到的数据依然是undefind。

在HarmonyOS Next中,XComponent组件的onLoad事件不触发且getXComponentContext()返回undefined,通常由以下原因导致:

  1. XComponent组件未正确加载或渲染完成。
  2. 组件生命周期时序问题,onLoad可能尚未执行。
  3. XComponentController未与组件正确绑定或绑定时机不当。

请检查XComponent的加载状态及Controller的绑定逻辑。

根据你的描述,问题很可能出在你自己编译的 ijkplayer.har 静态包上。onLoad 事件不触发或返回 undefined,通常意味着 XComponent 的 Native 层(即你的 HAR 包中的 C++ 部分)没有正确初始化或与 ArkTS 层的交互链路没有建立。

核心排查方向:

  1. HAR 包 Native 层导出符号问题:这是最可能的原因。XComponent 的 onLoad 事件依赖于 HAR 包中导出的特定 Native 函数(例如用于初始化和获取上下文的函数)。你自己编译的 HAR 包可能:

    • 没有导出必要的函数:检查你的 Native 代码(尤其是与 napi 相关的模块初始化、上下文创建函数)是否正确定义并使用 EXTERN_C_STARTEXTERN_C_END 以及 __attribute__((visibility("default")))-fvisibility=default 编译选项,确保这些函数符号对 ArkTS 层可见。
    • 函数签名不匹配:确保导出的 Native 函数名、参数、返回值类型与 HarmonyOS XComponent 框架预期的完全一致。任何不匹配都会导致查找失败,返回 undefined
  2. HAR 包结构或配置问题

    • oh-package.json5 配置:对比你编译的 HAR 包和远程可用 HAR 包的 oh-package.json5 文件。重点检查 nativeLibrary 字段的配置是否正确指向了你编译的 .so 库文件,以及 nametypes 路径等是否配置无误。
    • .so 库文件:确认 HAR 包中打包的 .so 库是针对正确的设备架构(如 arm64-v8a)编译的,并且其依赖的其它库(如 ffmpeg、yuv)也已正确链接并打包。
  3. 编译环境与依赖库版本

    • 你本地编译 ffmpeg、yuv 等依赖库时使用的版本、配置选项(如编解码器支持、API 版本)可能与远程 HAR 包使用的版本存在差异。这种差异有时会导致生成的二进制接口不兼容,进而破坏 XComponent 所需的初始化流程。
    • 确保你使用的 NDK 版本、CMake 版本等编译工具链与 HarmonyOS Next 官方推荐或远程库构建环境保持一致。

建议的排查步骤:

  1. 对比分析:使用反编译或查看构建脚本的方式,仔细对比远程可用的 ijkplayer.har 和你本地编译的 ijkplayer.har 在以下方面的差异:

    • oh-package.json5 文件内容。
    • HAR 包内部目录结构,特别是 native 目录下的 .so 库文件。
    • 如果可能,对比两者 Native 层代码的构建脚本(如 CMakeLists.txt),检查编译标志、链接库等关键配置。
  2. 检查构建日志:重新编译你的 HAR 包,并完整保存构建过程的输出日志。仔细检查在编译 Native 部分(C++)时,是否有关于函数可见性(visibility)、链接(linking)的警告或错误信息。

  3. 简化验证:创建一个极简的 HarmonyOS Next 测试工程,仅包含 XComponent 组件和你编译的 HAR 包,排除你主工程中其他复杂代码的干扰。在 onLoad 中仅打印日志,看事件是否触发及上下文是否为 undefined

  4. 验证 Native 库:可以尝试编写一个简单的 Native 测试程序(非 HarmonyOS 环境),直接调用你编译的 .so 库中的关键初始化函数,验证其基本功能是否正常。

由于问题根因高度指向自定义编译的 HAR 包,你的排查重点应放在对比原生可用的 HAR 包与你自编译包的差异上,特别是 Native 层的导出符号和链接配置。

回到顶部