# ohos_call_sequence_error_demo **Repository Path**: LoginSinQ/ohos_call_sequence_error_demo ## Basic Information - **Project Name**: ohos_call_sequence_error_demo - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-06-16 - **Last Updated**: 2025-06-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 验证鸿蒙线程安全函数调用顺序错乱问题 ## 实现逻辑说明 鸿蒙和 rust 调用方向: ArkTS <=> C++ <=> ffi <=> rust 现状是 ArkTS 给 Rust 设置了两个监听,rust 内部启动两个线程回调这两个监听,napi 通过线程安全函数把结果返给 ArkTS StringListener : rust 把一个字符串返给 ArkTS IntListener :rust 把一个数字返给 ArkTS ## 项目路径介绍 ```text . ├── my_rust_sdk // rust sdk,生成 C 的 .a & .h 供鸿蒙静态库使用 ├── my_lib // 鸿蒙静态库,包含 C++ 代码 ├── entry // 鸿蒙 Demo └── scripts // 编译脚本,负责把 rust sdk 变成 C 语言静态库 ``` # 运行项目 ## 安装 rust nightly 版本和鸿蒙编译链 1. rust nightly 的安装和 aarch64-unknown-linux-ohos 安装 如何安装可以问 ai 2. 配置环境变量 RC_OPEN_OHOS_PATH 目的是找到鸿蒙平台的 clang 和鸿蒙平台的头文件 详细见 scripts/build-rust.sh 的实现 ## 编译 rust 项目根路径下执行 ```shell bash scripts/build-rust.sh ``` 编译成功后 可以看到 my_lib/src/main/cpp/rcim_client.h ,这是 rust 生成的 .h 文件 可以看到 my_lib/src/main/cpp/libs/arm64-v8a/librust_sdk.a ,这是 rust 生成的 .a 库 鸿蒙静态库项目 my_lib 直接依赖了 librust_sdk.a 编译好 rust 库之后,就可以直接运行 APP 项目了 # 问题 Log 分析 ## 原始日志 ```text 06-24 16:31:53.819 7790-7961 A00001/IM-Native io.qxb.co...lication I CPP nativeSetStringListener ts_func_ptr:0000007F796D5100 value:0 06-24 16:31:53.819 7790-7961 A00001/IM-Native io.qxb.co...lication I CPP nativeSetIntListener ts_func_ptr:0000007F796D51A0 value:1000000 06-24 16:31:53.819 7790-7962 A00001/IM-Native io.qxb.co...lication I CPP nativeSetStringListener ts_func_ptr:0000007F794D2100 value:3 06-24 16:31:53.819 7790-7961 A00001/IM-Native io.qxb.co...lication I CPP nativeSetStringListener ts_func_ptr:0000007F796D5100 value:1 06-24 16:31:53.819 7790-7961 A00001/IM-Native io.qxb.co...lication I CPP nativeSetIntListener ts_func_ptr:0000007F796D51A0 value:1000001 06-24 16:31:53.819 7790-7961 A00001/IM-Native io.qxb.co...lication I CPP nativeSetStringListener ts_func_ptr:0000007F796D5100 value:2 06-24 16:31:53.819 7790-7961 A00001/IM-Native io.qxb.co...lication I CPP nativeSetIntListener ts_func_ptr:0000007F796D51A0 value:1000002 06-24 16:31:53.819 7790-7961 A00001/IM-Native io.qxb.co...lication I CPP nativeSetStringListener ts_func_ptr:0000007F796D5100 value:5 06-24 16:31:53.819 7790-7961 A00001/IM-Native io.qxb.co...lication I CPP nativeSetIntListener ts_func_ptr:0000007F796D51A0 value:1000005 06-24 16:31:53.819 7790-7961 A00001/IM-Native io.qxb.co...lication I CPP nativeSetStringListener ts_func_ptr:0000007F796D5100 value:6 06-24 16:31:53.819 7790-7961 A00001/IM-Native io.qxb.co...lication I CPP nativeSetIntListener ts_func_ptr:0000007F796D51A0 value:1000006 06-24 16:31:53.819 7790-7961 A00001/IM-Native io.qxb.co...lication I CPP nativeSetStringListener ts_func_ptr:0000007F796D5100 value:7 06-24 16:31:53.819 7790-7961 A00001/IM-Native io.qxb.co...lication I CPP nativeSetIntListener ts_func_ptr:0000007F796D51A0 value:1000007 06-24 16:31:53.819 7790-7962 A00001/IM-Native io.qxb.co...lication I CPP nativeSetIntListener ts_func_ptr:0000007F794D21A0 value:1000003 06-24 16:31:53.819 7790-7961 A00001/IM-Native io.qxb.co...lication I CPP nativeSetStringListener ts_func_ptr:0000007F796D5100 value:8 06-24 16:31:53.819 7790-7962 A00001/IM-Native io.qxb.co...lication I CPP nativeSetStringListener ts_func_ptr:0000007F794D2100 value:4 06-24 16:31:53.819 7790-7962 A00001/IM-Native io.qxb.co...lication I CPP nativeSetIntListener ts_func_ptr:0000007F794D21A0 value:1000004 06-24 16:31:53.819 7790-7961 A00001/IM-Native io.qxb.co...lication I CPP nativeSetIntListener ts_func_ptr:0000007F796D51A0 value:1000008 06-24 16:31:53.819 7790-7962 A00001/IM-Native io.qxb.co...lication I CPP nativeSetStringListener ts_func_ptr:0000007F794D2100 value:9 06-24 16:31:53.819 7790-7961 A00001/IM-Native io.qxb.co...lication I CPP nativeSetIntListener ts_func_ptr:0000007F796D51A0 value:1000009 06-24 16:31:53.821 7790-7790 A00000/IM-App io.qxb.co...lication I ArkTS nativeSetStringListener :0 06-24 16:31:53.821 7790-7790 A00000/IM-App io.qxb.co...lication I ArkTS nativeSetStringListener :1 06-24 16:31:53.821 7790-7790 A00000/IM-App io.qxb.co...lication I ArkTS nativeSetStringListener :2 06-24 16:31:53.821 7790-7790 A00000/IM-App io.qxb.co...lication I ArkTS nativeSetStringListener :5 06-24 16:31:53.821 7790-7790 A00000/IM-App io.qxb.co...lication I ArkTS nativeSetStringListener :6 06-24 16:31:53.821 7790-7790 A00000/IM-App io.qxb.co...lication I ArkTS nativeSetStringListener :3 06-24 16:31:53.821 7790-7790 A00000/IM-App io.qxb.co...lication I ArkTS nativeSetStringListener :7 06-24 16:31:53.821 7790-7790 A00000/IM-App io.qxb.co...lication I ArkTS nativeSetStringListener :4 06-24 16:31:53.821 7790-7790 A00000/IM-App io.qxb.co...lication I ArkTS nativeSetStringListener :8 06-24 16:31:53.821 7790-7790 A00000/IM-App io.qxb.co...lication I ArkTS nativeSetStringListener :9 06-24 16:31:53.821 7790-7790 A00000/IM-App io.qxb.co...lication I ArkTS nativeSetIntListener :1000000 06-24 16:31:53.821 7790-7790 A00000/IM-App io.qxb.co...lication I ArkTS nativeSetIntListener :1000001 06-24 16:31:53.821 7790-7790 A00000/IM-App io.qxb.co...lication I ArkTS nativeSetIntListener :1000002 06-24 16:31:53.821 7790-7790 A00000/IM-App io.qxb.co...lication I ArkTS nativeSetIntListener :1000005 06-24 16:31:53.821 7790-7790 A00000/IM-App io.qxb.co...lication I ArkTS nativeSetIntListener :1000006 06-24 16:31:53.821 7790-7790 A00000/IM-App io.qxb.co...lication I ArkTS nativeSetIntListener :1000007 06-24 16:31:53.821 7790-7790 A00000/IM-App io.qxb.co...lication I ArkTS nativeSetIntListener :1000003 06-24 16:31:53.821 7790-7790 A00000/IM-App io.qxb.co...lication I ArkTS nativeSetIntListener :1000004 06-24 16:31:53.821 7790-7790 A00000/IM-App io.qxb.co...lication I ArkTS nativeSetIntListener :1000008 06-24 16:31:53.821 7790-7790 A00000/IM-App io.qxb.co...lication I ArkTS nativeSetIntListener :1000009 ``` ## 问题 Log 分析 CPP 开头的日志内容代表是 鸿蒙 napi C++ 的代码 ArkTS 开头的日志内容代表是 鸿蒙 ArkTS 的代码 看 nativeSetStringListener 的日志前两行,在 CPP 返回的 0 , 3 两个数据 ```text 06-24 16:31:53.819 7790-7961 A00001/IM-Native io.qxb.co...lication I CPP nativeSetStringListener ts_func_ptr:0000007F796D5100 value:0 06-24 16:31:53.819 7790-7962 A00001/IM-Native io.qxb.co...lication I CPP nativeSetStringListener ts_func_ptr:0000007F794D2100 value:3 ``` 但是在 ArkTS 返回前两行是 0,1 两个数据 ```text 06-24 16:31:53.821 7790-7790 A00000/IM-App io.qxb.co...lication I ArkTS nativeSetStringListener :0 06-24 16:31:53.821 7790-7790 A00000/IM-App io.qxb.co...lication I ArkTS nativeSetStringListener :1 ``` # 本地环境 ```text DevEco Studio 5.0.1 Release Build #DS-233.14475.28.36.505310 Build Version: 5.0.5.310, built on December 11, 2024 Runtime version: 17.0.12+1-b1087.25 aarch64 VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o. macOS 13.0.1 GC: G1 Young Generation, G1 Old Generation Memory: 2048M Cores: 8 Metal Rendering is ON Registry: idea.plugins.compatible.build=IC-233.14475.28 Non-Bundled Plugins: com.huawei.deveco.intelligent-assistant (0.408.3) com.huawei.cangjie-support-plugin (5.0.3.500) ```