0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【开源三方库】Aki:一行代码极简体验JS&C++跨语言交互

OpenAtom OpenHarmony 来源:未知 2023-08-02 21:05 次阅读

点击蓝字 ╳ 关注我们


开源项目 OpenHarmony
是每个人的 OpenHarmony

郭振雄

OpenHarmony知识体系组


一、简介

OpenAtom OpenHarmony(以下简称“OpenHarmony”)的前端开发语言是ArkTS,在TypeScript(简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是JavaScript(简称JS)的超集。而Node-API(简称NAPI)是方舟引擎用于封装JS能力为Native插件的API,是前端JS与Native C/C++的FFI(Foreign Function Interface 跨语言交互接口)。
Aki——针对OpenHarmony上提供JS与C/C++跨语言互调的场景提供解决方案,提供了复杂度仅为O(1)级别的极简语法糖使用方式,一行代码完成JS与C/C++的无障碍跨语言互调,所键即所得。同时开发者无需关心NAPI的线程安全问题、Native对象GC问题,为开发者屏蔽NAPI内部复杂逻辑。


OpenHarmony中NAPI的用法不在本文阐述,不然就有点像孔乙己“茴香豆有几种写法”的感觉了。感兴趣的可以参考OpenHarmony关于Native API使用指导。而开发者使用NAPI过程中还会发现:为了做跨线程任务,需要做线程管理,需要关心环境上下文;为了使用结构体对象,需要关注napi_value生命周期如何管理;巴拉巴拉等等与自己业务无关的逻辑。搞了半天,发现业务代码一行没写,还在写NAPI的跨语言调用实现。拥有洁癖的开发者还会发现,很难做到隔离NAPI代码与业务代码,我们讨厌毫无边界性的编程

二、所键即所得:NAPI的尽头就是Aki



归根结底NAPI要做的就是FFI即跨语言调用,而开发者重视的是自己的业务逻辑而不是如何做跨语言调用:我就想把大象放进冰箱,你非要告诉我:先打开冰箱,然后抬起大象放进去,再关上冰箱。开发者想要的就是直截了当指明这个函数是个跨语言调用函数。Aki提供了JSBind语法糖,就做了这么一件事,开发者集成后,完全做到一行代码:所键即所得,并把业务代码与FFI代码完美隔离,提供了友好的边界性编程体验。

示例一:同步异步接口封装
示例一期望将C++业务逻辑(GetName)注册为JS同步接口(getSync)、异步接口(getAsync),Aki提供了极简的JSBind函数绑定语法糖,一行代码绑定跨语言调用接口:
● C/C++ Code
#include 


// C++业务逻辑
std::string GetName(std::string key)
{
std::string result = ...... // 获取数据的业务逻辑


return result; // 返回字符串类型
}


// Aki JSBind语法糖
JSBIND_ADDON(task_runner);
JSBIND_GLOBAL() {
JSBIND_FUNCTION(GetName, "getNameSync"); // 绑定同步方法
JSBIND_PFUNCTION(GetName, "getNameAsync"); // 绑定异步方法
}

● JavaScript Code
import libtask_runner from 'libtask_runner.so';


const name = libstorage.getNameSync('name');// 调用同步方法
console.log('name is ' + name);


// 调用异步方法
libstorage.getNameAsync('name').then(date => {
console.log('name is ' + data);
}).catch(error => {
console.log('error: ' + error);
});

示例二:Native与JS对象绑定
示例二期望将C++结构体/类对象(Person)逻辑注册为JS类对象(Person),包含类构造函数+类成员函数+类静态函数+类属性访问等特性,通知支持类对象作为参数及返回值。Aki提供了极简的JSBind对象绑定语法糖,开发者无需关注Native对象内存与JS引擎GC垃圾回收关系,直接绑定Native对象:
● C/C++ Code
#include 


// C++逻辑
struct Person {
// 构造函数,用于JS侧 new 对象
Person(std::string name) : name(name) {}


// 静态函数
static Person GetAllPerson(); // 支持类对象作为参数


// 成员函数
int SayHello();


std::string name;
};


// Aki JSBind语法糖
JSBIND_ADDON(person);
JSBIND_CLASS(Person) {
JSBIND_CONSTRUCTOR<std::string>(); // 绑定构造函数
JSBIND_METHOD(GetAllPerson); // 绑定类静态函数
JSBIND_METHOD(SayHello); // 绑定类成员函数
JSBIND_PROPERTY(name); // 绑定类成员属性
}

● JavaScript Code
import libperson from 'libperson.so';


let person = new libperson.Person("aki"); // 调用构造函数
console.log('person name: ' + person.name); // 访问类属性
let greeting = person.SayHello(); // 调用类成员函数
letpersons=libperson.Person.GetAllPerson();//调用类静态函数

示例三:在非JS线程中回调JS接口
示例三期望在非JS线程中回调JS接口,Aki提供了线程安全的JSBind语法糖,开发者无需关注JS线程安全问题——OpenHarmony方舟引擎规定JS回调的任务必须抛到JS线程中才能执行,否则会出现崩溃(即Native侧只能在JS线程使用NAPI)。
● C/C++ Code
#include 


// C++逻辑
void SafetyCallback(std::function<void (std::string)> callback) {
std::thread t([callback = std::move(callback)] () {
callback("aki"); // 线程安全,直接调用
});
t.detach();
}


// Aki JSBind语法糖
JSBIND_ADDON(sub_thread);
JSBIND_GLOBAL() {
JSBIND_FUNCTION(SafetyCallback);
}

● JavaScript Code
import libsub_thread from 'libsub_thread.so';
// 入参为JS方法回调
libsub_thread.SafetyCallback((data) => {
console.error('test result = ' + data); // test result = aki
})

示例四:Native调用绑定JS函数
示例四期望在C/C++侧调用JS接口(非回调)创建rdb关系型数据库表。Aki提供了JS侧的内建JSBind语法糖,开发者可直接绑定JS侧函数供Native侧调用。
● JavaScript Code
import libAddon from 'libaddon.so'


function createTable(table: string) {
rdbStore.executeSql()... // OHOS 关系型数据库逻辑
}


libAddon.JSBind.bindFunction('createTable',createTable);//绑定JS函数

● C/C++ Code
#include 


// C++逻辑
bool DoSomethingFromNative() {
if (auto createTable = aki::GetJSFunction("createTable")) {
createTable->Invoke<void>("MYSTORE"); // 入参类型 string
}

示例五:类型转换

Aki支持丰富的类型转换,几乎所有JS的数据类型都可以通过Aki映射为同等的C/C++数据类型,开发者无需处理类型转换,如上述示例用法,框架支持自动匹配类型转换,下表为当前支持的完整类型转换关系:



三、集成依赖Aki

1.创建平台工程
DevEco Studio 创建包含Native C++的工程

File > New > Create Project | Module

2.配置依赖并安装
● ohpm三方组件依赖:@ohos/aki
指定模块路径下(如:项目根路径/entry),输入如下命令安装ohpm har包依赖:
cd entry
ohpminstall@ohos/aki

CMakeLists.txt添加依赖:
...
set(AKI_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules/@ohos/aki) # 设置AKI根路径
set(CMAKE_MODULE_PATH ${AKI_ROOT_PATH})
find_package(Aki REQUIRED)
...
target_link_libraries(${YOUR_TARGET} PUBLIC Aki::libjsbind) # 链接二进制依赖
...

● 源码依赖
用户自定义路径下(如:项目根路径/entry/src/main/cpp),输入如下命令下载源码:
cd entry/src/main/cpp
gitclonehttps://gitee.com/openharmony-sig/aki.git
CMakeLists.txt添加依赖:
...
add_subdirectory(aki)
target_link_libraries(entry PUBLIC aki_jsbind) // entry 为编译目标
...

3.编译工程&运行
完成!!!

相关链接

《Aki使用指导》

https://gitee.com/openharmony-sig/aki

《Aki example》

https://gitee.com/openharmony-sig/aki/tree/master/example/ohos

OpenHarmony三方库中心

https://ohpm.openharmony.cn/#/cn/home

DevEco Studio

https://developer.harmonyos.com/cn/develop/deveco-studio/

Native API使用指导

https://docs.openharmony.cn/pages/v4.0/zh-cn/application-dev/napi/napi-guidelines.md/



原文标题:【开源三方库】Aki:一行代码极简体验JS&C++跨语言交互

文章出处:【微信公众号:OpenAtom OpenHarmony】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 鸿蒙
    +关注

    关注

    57

    文章

    2350

    浏览量

    42842
  • OpenHarmony
    +关注

    关注

    25

    文章

    3721

    浏览量

    16301

原文标题:【开源三方库】Aki:一行代码极简体验JS&C++跨语言交互

文章出处:【微信号:gh_e4f28cfa3159,微信公众号:OpenAtom OpenHarmony】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    ARM开发板编程语言选择

    提供了对硬件的直接控制能力,可以生成紧凑、高效的代码平台:C语言具有很好的平台特性,可以在多种操作系统和硬件平台上运行。 丰富的
    的头像 发表于 11-05 11:14 346次阅读

    鸿蒙Flutter实战:05-使用第三方插件

    # 鸿蒙Flutter 实战:使用第三方插件 在鸿蒙Flutter开发中,如果涉及到使用原生功能,就要使用插件。使用插件有两种方式,种是自己编写原生ArkTS代码,在Dart侧调用。另外
    发表于 10-22 21:54

    鸿蒙端实践-JS虚拟机架构实现

    在Roma端方案中,JS虚拟机是框架的核心,负责执行动态化的JS代码。在Android平台采用了基于V8的J2V8,iOS平台则使用了系统自带的JSCore,而在HarmonyOS中
    的头像 发表于 09-30 14:42 2411次阅读
    鸿蒙<b class='flag-5'>跨</b>端实践-<b class='flag-5'>JS</b>虚拟机架构实现

    种常用嵌入式开发代码

    使用开源协议:GPL-2.0varch简介varch(we-architecture,意为我们的框架)是嵌入式C语言常用代码模块
    的头像 发表于 09-04 08:06 472次阅读
    <b class='flag-5'>一</b>种常用嵌入式开发<b class='flag-5'>代码</b><b class='flag-5'>库</b>

    维天地低代码开发平台助力第三方质检行业数据可视化

    三方检验是由独立于买卖双方利益之外的第三方机构(例如专业的监督检验机构)执行的,这些机构以公正、公平、权威的非当事人身份,依据双方共同认可的法律、标准和合同等进行商品的符合性检验和认证活动
    的头像 发表于 08-09 13:59 270次阅读
    <b class='flag-5'>三</b>维天地低<b class='flag-5'>代码</b>开发平台助力第<b class='flag-5'>三方</b>质检行业数据可视化

    芯、EDA²、华为云三方签署战略合作框架协议

    EDA²的秘书处代表郑云升先生介绍了签约背景。EDA²于去年12月在无锡发布“碧玄岩”评测中心。EDA²、芯、华为云三方各有自身优势,此次战略合作是为了实现优势互补、共同提升EDA质量,建立用户
    的头像 发表于 08-01 11:43 1306次阅读

    c语言怎么做可视化界面

    介绍如何使用C语言开发可视化界面,包括所需的、工具和开发步骤。 选择合适的图形 为了在C语言
    的头像 发表于 06-06 10:46 2333次阅读

    微软或将开放Xbox主机授权给第三方厂商

    据悉,5 月 26 日,知名媒体 Windows Central 的编辑 Jez Corden 揭露了微软即将遵循第三方手柄流程,允许在其 XBOX 主机上引入第三方产品。
    的头像 发表于 05-27 15:18 658次阅读

    Labview如何内嵌操作第三方EXE程序!

    自己在网上搜了下相关资料,能把第三方EXE内嵌进入容器里,但是有个问题,这个第三方软件必须手动拖到容器正中间,手动最大化。请问有什么方法可以自动实现吗? 下图是我内嵌的POLL 软件。如图!
    发表于 04-18 14:26

    鸿蒙OS开发学习:【第三方调用】

    在Stage模型中,如何调用已经上架到[三方中心]的社区和项目内创建的本地
    的头像 发表于 04-14 11:34 913次阅读
    鸿蒙OS开发学习:【第<b class='flag-5'>三方</b><b class='flag-5'>库</b>调用】

    如何成为名嵌入式C语言高手?

    、通过实践项目提升技能理论知识是建立在实践基础之上的。选择些小型的嵌入式项目,例如LED闪烁、温度监测等简单的应用,将所学的C语言知识应用到实际中。通过实践,你可以了解如何将
    发表于 04-07 16:03

    如何成为名嵌入式C语言高手?

    、通过实践项目提升技能理论知识是建立在实践基础之上的。选择些小型的嵌入式项目,例如LED闪烁、温度监测等简单的应用,将所学的C语言知识应用到实际中。通过实践,你可以了解如何将
    发表于 03-25 14:12

    鸿蒙开发学习:【OpenHarmony HAR】

    OpenHarmony js/ts三方使用的是OpenHarmony静态共享包,即HAR(Harmony Archive),可以包含js/ts代码
    的头像 发表于 03-18 16:27 751次阅读

    Meta Quest头显将支持多款安卓第三方应用并行

    Meta已悄然启动了与此相关的功能,意味着Quest头显可同时操作多个第三方Android应用。在此之前,Quest对第三方Android应用有严格限制,用户每次仅能打开个,无法实现同屏幕并行多个第
    的头像 发表于 03-11 10:58 747次阅读

    源译识 | 译文分享:ASF第三方开源组件许可证政策

    /translation.  译文全文 (双语对照版请浏览文末“阅读原文”) 目的 本政策向Apache软件基金会的项目提供许可指引,列出了第三方开源
    的头像 发表于 01-05 19:50 835次阅读
    源译识 | 译文分享:ASF第<b class='flag-5'>三方</b><b class='flag-5'>开源</b>组件许可证政策