【华为鸿蒙开发技术】仓颉与ArkTS互操作开发详解—高效模块集成指南

举报
柠檬味拥抱 发表于 2024/10/22 18:45:57 2024/10/22
【摘要】 仓颉开发语言概述仓颉(Cangjie)是一种专为 OpenHarmony 设计的轻量级开发语言,旨在与 ArkTS(Ark TypeScript)实现无缝互操作。本文将介绍仓颉语言的基本结构,并结合代码示例深入探讨其在开发互操作模块中的应用。 仓颉与 ArkTS 的互操作仓颉与 ArkTS 的互操作是通过仓颉模块导出函数给 ArkTS 调用的形式来实现的。仓颉侧负责实现核心逻辑,而 Ark...

仓颉开发语言概述

仓颉(Cangjie)是一种专为 OpenHarmony 设计的轻量级开发语言,旨在与 ArkTS(Ark TypeScript)实现无缝互操作。本文将介绍仓颉语言的基本结构,并结合代码示例深入探讨其在开发互操作模块中的应用。

仓颉与 ArkTS 的互操作

仓颉与 ArkTS 的互操作是通过仓颉模块导出函数给 ArkTS 调用的形式来实现的。仓颉侧负责实现核心逻辑,而 ArkTS 通过定义接口调用仓颉的功能模块。下面将逐步介绍如何使用仓颉开发与 ArkTS 的互操作模块。

仓颉导出函数与 ArkTS 调用

首先,开发者需要在仓颉中定义要导出的函数,这些函数的类型是固定的,格式为 (JSContext, JSCallInfo) -> JSValue

代码示例:定义仓颉导出函数

import ohos.ark_interop.*

// 定义仓颉导出函数,供 ArkTS 调用
func addNumber(context: JSContext, callInfo: JSCallInfo): JSValue {
    // 从 JSCallInfo 中获取参数
    let arg0: JSValue = callInfo[0]
    let arg1: JSValue = callInfo[1]

    // 转换为仓颉类型
    let a: Float64 = arg0.toNumber()
    let b: Float64 = arg1.toNumber()

    // 计算结果
    let value = a + b

    // 转换并返回 JSValue
    let result: JSValue = context.number(value).toJSValue()
    return result
}

在该示例中,addNumber 函数接受两个数字参数,并返回它们的和。JSContext 提供了与 ArkTS 的交互环境,JSCallInfo 则包含 ArkTS 传递的参数。

注册仓颉导出函数

仓颉中的函数需要注册后才能被 ArkTS 调用。使用 JSModule.registerModule 注册。

class Main {
    static init() {
        JSModule.registerModule { context, exports =>
            exports["addNumber"] = context.function(addNumber).toJSValue()
        }
    }
}

ArkTS 调用仓颉函数

在 ArkTS 侧,需要导入仓颉库并调用导出的函数。

ArkTS 侧代码示例

import { requireCJLib } from "libark_interop_loader.so"

interface CangjieLib {
    addNumber(a: number, b: number): number;
}

const cjLib = requireCJLib("libentry_default.so") as CangjieLib;
let result = cjLib.addNumber(1, 2);
console.log(`1 + 2 = ${result}`);

该代码展示了如何从 ArkTS 调用仓颉模块中的 addNumber 函数,并输出计算结果。

加载 ArkTS 模块

仓颉不仅可以被 ArkTS 调用,还可以从 ArkTS 加载模块。例如,我们可以加载 ArkTS 提供的相册管理模块。

代码示例:加载 ArkTS 模块

import ohos.ark_interop.*

func tryLoadArkTSSo() {
    // 创建 ArkTS 运行时
    let runtime = JSRuntime()
    let context = runtime.mainContext

    // 加载系统模块
    let module = context.requireSystemNativeModule("file.photoAccessHelper")
}

在上述代码中,我们创建了一个 ArkTS 运行时,并加载了相册管理模块(file.photoAccessHelper)。

操作 ArkTS 数据

仓颉可以操作 ArkTS 传递的对象和数据。仓颉的 JSValue 是一种通用类型,可以通过 JSValue.typeof() 来判断其实际类型。

代码示例:操作 ArkTS 数据

func addByObject(context: JSContext, callInfo: JSCallInfo): JSValue {
    let arg0 = callInfo[0]
    
    if (!arg0.isObject()) {
        return context.undefined().toJSValue()
    }

    let obj = arg0.asObject(context)
    let argA = obj["a"]
    let argB = obj["b"]

    let a = argA.toNumber()
    let b = argB.toNumber()
    
    let result = a + b
    return context.number(result).toJSValue()
}

该函数接收一个 ArkTS 对象作为参数,并从对象中提取属性 ab,计算它们的和。

调用 ArkTS 函数

仓颉可以直接调用 ArkTS 函数,甚至支持传递回调函数。

代码示例:调用 ArkTS 回调函数

func addByCallback(context: JSContext, callInfo: JSCallInfo): JSValue {
    let a = callInfo[0].toNumber()
    let b = callInfo[1].toNumber()
    let callback = callInfo[2].asFunction(context)

    let result = a + b
    let retJSValue = context.number(result).toJSValue()

    callback.call(retJSValue)
}

在该示例中,仓颉计算了 ab 的和,并通过回调函数将结果传递给 ArkTS。

仓颉与 ArkTS 的深度集成

通过仓颉与 ArkTS 的互操作性,开发者能够灵活地利用两种语言的优势,构建更为高效的应用模块。仓颉提供了直接操作 ArkTS 数据和模块的能力,而 ArkTS 则可以轻松地调用仓颉的核心功能。

仓颉中的全局对象

在仓颉中,可以访问 ArkTS 的全局对象,并通过它来调用全局属性和方法。

代码示例:操作全局对象

func accessGlobal(context: JSContext) {
    let globalObject = context.global
    let console = globalObject["console"].asObject(context)
    let log = console["log"].asFunction(context)
    
    log.call(context.string("Hello from Cangjie").toJSValue())
}

在该代码中,我们通过全局对象访问 ArkTS 的 console 对象,并调用其 log 方法进行日志输出。

image.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。