HarmonyOS 鸿蒙Next:【仓颉】引入 std.ast.Node 直接导致 so 不执行和 std.os.posix 库无法使用 VArray 和 Array 类型的问题
HarmonyOS 鸿蒙Next:【仓颉】引入 std.ast.Node 直接导致 so 不执行和 std.os.posix 库无法使用 VArray 和 Array 类型的问题
-
采用 ArkTS + 仓颉混合开发,仓颉代码里 import std.ast.Node 之后,即使完全没有在代码里用到 Node 类,AtkTS 调用仓颉的函数,但是实际情况看起来完全没有执行仓颉的代码(仓颉代码的函数入口处直接用 hilog 打印日志,在 DevEco 里也看不到任何日志),ArkTS 也没有报异常。去掉 import 之后代码就正常工作了。
-
std.os.posix.read 和 write 函数只接收 CPointer 类型,没有办法传递 Array 或者 VArray,导致内存需要复制,而且复制只能用 CPointer.write 一个个元素的写入,执行效率和开发效率都很低。不确定是否有方法可以直接将 Array 或者 VArray 转换为 CPointer。
-
有没有官方的仓颉开发者群,急需一个可以讨论仓颉问题的环境。
更多关于HarmonyOS 鸿蒙Next:【仓颉】引入 std.ast.Node 直接导致 so 不执行和 std.os.posix 库无法使用 VArray 和 Array 类型的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
这里贴一下的华为工程师的回复:
1、在鸿蒙应用开发中,std.ast 包只能在 macro package 中使用,并且只能使用 import 或 private import 去导入该包,不能用 internal import导入。
2、可以使用
acquireArrayRawData
函数 从Array<T>
中获取数据的原始指针实例,然后传递给上述 write 函数,使用完成后,再通过releaseArrayRawData
函数释放该原始指针实例。以上两个函数可参考文档:
- https://developer.huawei.com/consumer/cn/doc/cangjie-guides-V5/core_package_funcs-V5#func-acquirearrayrawdatatarrayt-where-t–ctype
- https://developer.huawei.com/consumer/cn/doc/cangjie-guides-V5/core_package_funcs-V5#func-releasearrayrawdatatcpointerhandlet-where-t–ctype
示例如下:
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
库无法使用VArray
和Array
类型的问题,这里提供可能的解决方案概述:
鸿蒙系统中的【仓颉】组件在引入std.ast.Node
时,可能与现有的系统库或运行时环境存在不兼容情况,导致.so
文件(共享库)无法正确加载或执行。这可能是由于类型冲突、内存布局问题或ABI(应用程序二进制接口)不匹配等原因造成的。
同时,std.os.posix
库在鸿蒙系统中的实现可能与标准C++库中的VArray
和Array
类型不完全兼容,这可能是由于鸿蒙系统对内存管理、类型安全或API设计的特定要求所致。
为了解决这些问题,可以尝试以下方法:
- 确认【仓颉】组件的版本与鸿蒙系统版本兼容。
- 检查
.so
文件的编译选项和目标架构是否与当前系统一致。 - 使用鸿蒙系统提供的特定类型或API替代
VArray
和Array
,以适应系统要求。 - 查阅鸿蒙系统的官方文档或开发者社区,了解是否有相关的已知问题或补丁。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html