HarmonyOS 鸿蒙Next:【仓颉】引入 std.ast.Node 直接导致 so 不执行和 std.os.posix 库无法使用 VArray 和 Array 类型的问题

发布于 1周前 作者 bupafengyu 来自 鸿蒙OS

HarmonyOS 鸿蒙Next:【仓颉】引入 std.ast.Node 直接导致 so 不执行和 std.os.posix 库无法使用 VArray 和 Array 类型的问题

  1. 采用 ArkTS + 仓颉混合开发,仓颉代码里 import std.ast.Node 之后,即使完全没有在代码里用到 Node 类,AtkTS 调用仓颉的函数,但是实际情况看起来完全没有执行仓颉的代码(仓颉代码的函数入口处直接用 hilog 打印日志,在 DevEco 里也看不到任何日志),ArkTS 也没有报异常。去掉 import 之后代码就正常工作了。

  2. std.os.posix.read 和 write 函数只接收 CPointer 类型,没有办法传递 Array 或者 VArray,导致内存需要复制,而且复制只能用 CPointer.write 一个个元素的写入,执行效率和开发效率都很低。不确定是否有方法可以直接将 Array 或者 VArray 转换为 CPointer。

  3. 有没有官方的仓颉开发者群,急需一个可以讨论仓颉问题的环境。


更多关于HarmonyOS 鸿蒙Next:【仓颉】引入 std.ast.Node 直接导致 so 不执行和 std.os.posix 库无法使用 VArray 和 Array 类型的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

这里贴一下的华为工程师的回复:

1、在鸿蒙应用开发中,std.ast 包只能在 macro package 中使用,并且只能使用 import 或 private import 去导入该包,不能用 internal import导入。

2、可以使用 acquireArrayRawData 函数 从 Array<T> 中获取数据的原始指针实例,然后传递给上述 write 函数,使用完成后,再通过 releaseArrayRawData 函数释放该原始指针实例。

以上两个函数可参考文档:

示例如下:

let data = Array<UInt8>(1000, item: 1)
unsafe { // 以下方法需要在 unsafe 代码块中调用

    let rawData: CPointerHandle<UInt8> = acquireArrayRawData(data)

    let cp: CPointer<UInt8> = rawData.pointer  // 获取对应的 CPointer 指针

    let count = write(1, cp, 1000)  // 调用write方法

    releaseArrayRawData(rawData) // 注意:一定要释放
}

更多关于HarmonyOS 鸿蒙Next:【仓颉】引入 std.ast.Node 直接导致 so 不执行和 std.os.posix 库无法使用 VArray 和 Array 类型的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对帖子标题中提到的HarmonyOS(鸿蒙)Next系统中,【仓颉】引入std.ast.Node直接导致.so不执行以及std.os.posix库无法使用VArrayArray类型的问题,这里提供可能的解决方案概述:

鸿蒙系统中的【仓颉】组件在引入std.ast.Node时,可能与现有的系统库或运行时环境存在不兼容情况,导致.so文件(共享库)无法正确加载或执行。这可能是由于类型冲突、内存布局问题或ABI(应用程序二进制接口)不匹配等原因造成的。

同时,std.os.posix库在鸿蒙系统中的实现可能与标准C++库中的VArrayArray类型不完全兼容,这可能是由于鸿蒙系统对内存管理、类型安全或API设计的特定要求所致。

为了解决这些问题,可以尝试以下方法:

  • 确认【仓颉】组件的版本与鸿蒙系统版本兼容。
  • 检查.so文件的编译选项和目标架构是否与当前系统一致。
  • 使用鸿蒙系统提供的特定类型或API替代VArrayArray,以适应系统要求。
  • 查阅鸿蒙系统的官方文档或开发者社区,了解是否有相关的已知问题或补丁。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部