现在一般的场景是在已有 ArkTs 库中使用仓颉,所以可以将仓颉代码封装为 ArkTs 库,提供给外部使用。
原理就是互操作宏解析被注解修饰的仓颉代码,会自动生成 ArkTs 声明文件和互操作层代码。
使用步骤:
1.在 cj 文件中,针对 class、interface 和函数,使用 @Interop[ArkTS] 进行修饰,被修饰的对象是希望被 ArkTS 调用的。
2.在 DevEco Studio 中的仓颉文件或者 module 名称右键选择“Generate Cangjie-ArkTS Interop API”,会在 cangjie 目录下生成 ark_interop_api 的声明文件。
3.ArkTS 侧添加依赖并 import ark_interop_api 即可使用。
仓颉代码:
import ohos.ark_interop.*
import ohos.ark_interop_macro.*
@Interop[ArkTS]
public func sub(a: Int64, b: Int64): Int64 {
return a - b
}
@Interop[ArkTS]
public class CjDemo {
public let name: String
@Interop[ArkTS, Invisible]
public var id: Float64 = 1.0
public init(str: String) {
name = str
}
public func add(a: Int64, b: Int64): Int64 {
return a + b
}
public func foo(): Float64 {
return 1.0
}
}
生成的代码:
export declare class CjDemo {
name: string
add(a: number, b: number): number
foo(): number
}
export declare interface CustomLib {
sub(a: number, b: number): number
CjDemo: {new (str: string): CjDemo}
}
使用:
let cjLib : CustomLib = requireCJLib("libohos_app_cangjie_entry.so") as CustomLib
console.log("result" + cjLib.sub(2, 1))
let class1: CjDemo = new cjLib.CjDemo("arkts call")
console.log("result " + class1.add(5,1))