思维导图
详细总结
一、游戏与ArkTS接口交互场景
- 同步调用(场景一)
-
- 实现方式:通过
jsb.reflection.callStaticMethod
接口,传入参数true
标识同步调用。 - 代码示例:
- 实现方式:通过
let result1 = jsb.reflection.callStaticMethod(true, "entry/src/main/ets/test", "entry/test", JSON.stringify(param));
- 异步调用(场景二)
-
- 实现方式:
-
-
- 通过
jsb.reflection.callStaticMethod
发起调用(参数false
标识异步)。 - 利用worker线程通信机制,在worker中通过
evalString
执行JS回调逻辑。
- 通过
-
二、ArkTS模块导出与配置
- 模块定义(TS代码)
function test(param: string): string { return param; } // 同步方法
function syncTest(param: string, cb: Function): void { setTimeout(() => cb(param), 1000); } // 异步方法
- 配置文件(build-profile.json5)
buildOption: {
arkOptions: {
runtimeOnly: {
sources: ["./src/main/ets/test.ts"], // 指定TS模块文件路径
}
}
}
三、ArkTS线程间通信机制
线程类型 | 关键操作 |
主线程(UI线程) | 1. 创建worker实例: |
worker线程 | 1. 创建通信对象: |
四、ArkTS调用JavaScript代码
- JS侧准备
window.test1 = (a, b) => a + b; // 全局函数
window.person = { name: "zhangSan", age: 18 }; // 全局对象
- ArkTS侧调用
import cocos from 'libcocos.so'; // 引入Cocos库
let test1Result = cocos.evalString("test1(1, 2)"); // 调用JS函数,返回结果为`3`
let personName = cocos.evalString("person.name"); // 访问JS对象属性,返回`zhangSan`
关键问题
- Q:游戏如何同步调用ArkTS接口?
A:通过jsb.reflection.callStaticMethod(true, "模块路径", "方法名", 参数JSON)
,第一个参数true
表示同步调用,直接返回结果。 - Q:ArkTS主线程与worker线程如何通信?
A:主线程通过PortProxy
创建worker实例并监听消息,worker线程通过uiPort.postMessage
发送消息,同步通信可使用postSyncMessage
获取返回值。 - Q:ArkTS如何调用JS全局函数?
A:通过cocos.evalString("JS函数名(参数)")
执行JS代码,需先在JS侧定义全局函数(如window.test1 = (a,b) => a+b
),并在ArkTS中引入libcocos.so
库。