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】欢迎添加关注!文章转载请注明出处。

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

    关注

    60

    文章

    3071

    浏览量

    46275
  • OpenHarmony
    +关注

    关注

    33

    文章

    3989

    浏览量

    21479

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    国际电信联盟标准化局一行到访开放原子开源基金会座谈交流

    5月26日,国际电信联盟标准化局一行到访开放原子开源基金会座谈交流。会议围绕开源生态建设、国际标准制定、AI与具身智能协同、全球开源人才培养展开深入交流。国际电信联盟标准化局副局长比莱
    的头像 发表于 05-27 17:51 1069次阅读

    软通动力一行到访开放原子开源基金会座谈交流

    近日,软通动力集团一行到访开放原子开源基金会。双方聚焦开源根技术创新、生态协同共建、AI与开源操作系统深度融合等内容展开深入交流。软通动力董事长兼首席执行官刘天文,软通动力董事兼首席人
    的头像 发表于 05-21 11:50 472次阅读

    中国信通院一行到访开放原子开源基金会座谈交流

    近日,中国信息通信研究院(简称“中国信通院”)一行到访开放原子开源基金会。双方围绕开源产业研究、人工智能领域开源生态建设、开源项目孵化、
    的头像 发表于 05-21 11:48 486次阅读

    龙芯中科一行到访开放原子开源基金会座谈交流

    近日,龙芯中科技术股份有限公司(简称“龙芯”)胡伟武董事长一行到访开放原子开源基金会。基金会理事长谢少锋、秘书长助理兼运营部部长李博及业务发展部相关同事参加会议。
    的头像 发表于 05-21 11:45 498次阅读

    华为携手云新能科技一行莅临深圳技术大学交流合作

    近日,华为技术有限公司、云新能科技(深圳)有限公司一行莅临深圳技术大学,与城市交通与物流学院开展深度校企合作交流。学院对两家企业的到访表示热烈欢迎,三方围绕校企合作、产教融合、应用型复合型人才培养及未来高质量就业等议题展开务实
    的头像 发表于 05-20 10:52 366次阅读

    佳都科技集团一行到访开放原子开源基金会座谈交流

    4月1日,佳都科技集团一行到访开放原子开源基金会。基金会理事长谢少锋、佳都科技集团创始人兼CEO刘伟、高级副总裁刘佳、基金会秘书长助理兼运营部部长李博及业务发展部负责人等参加会议。双方围绕交鸿生态建设、开源社区运营、行业标准制定
    的头像 发表于 04-07 15:56 428次阅读

    工作流代码节点说明工作流代码节点说明

    说明如下: 开发语言 代码节点暂时只支持Python语言。 基于 Python 3.11.4 的标准,目前支持的有python内置的所有
    发表于 03-26 16:56

    宜宾市委书记存好一行莅临思必驰考察调研

    3月9日,宜宾市委书记存好一行莅临思必驰考察调研,详细了解企业发展历程、技术创新与产业落地情况。相关领导及部门负责人陪同调研,思必驰董事长、CEO 高始兴热情接待并作详细介绍。
    的头像 发表于 03-11 11:46 901次阅读

    钉钉正式开源HarmonyOS图片编辑组件

    近日,由钉钉团队自主研发的“HarmonyOS图片编辑组件”正式上线OpenHarmony三方中心仓并开源。作为款填补鸿蒙社区图像处理领域空白的重量级组件,该方案基于Harmony
    的头像 发表于 01-05 09:58 770次阅读

    开放原子开源基金会程晓明理事长一行莅临拓维信息交流,共绘开源产业新蓝图

    11月26日,开放原子开源基金会理事长程晓明、秘书长助理李博等一行莅临拓维信息总部考察交流。拓维信息创始人、董事长李新宇,拓维信息副总裁、开鸿智谷总裁廖秋林,拓维信息副总裁、CTO李曙光,开鸿智谷
    的头像 发表于 11-27 18:04 677次阅读
    开放原子<b class='flag-5'>开源</b>基金会程晓明理事长<b class='flag-5'>一行</b>莅临拓维信息交流,共绘<b class='flag-5'>开源</b>产业新蓝图

    C语言特性

    1、高效性:直接操作硬件 C 语言代码的执行效率极高,这是其最为显著的优势之。它能够直接访问硬件资源,与底层硬件进行紧密交互,充分发挥硬件
    发表于 11-24 07:01

    韩国交通部部长一行参访小马智

    10月17日,韩国国土交通部部长金润德一行抵达北京亦庄参观小马智,并试乘了无人驾驶Robotaxi。小马智副总裁高天带队接待了代表团一行。随团参访成员包括韩国国土交通部移动出行与汽
    的头像 发表于 10-24 16:59 1701次阅读

    货拉拉开源两款三方,为鸿蒙应用高效开发贡献力量

    、可扩展的通用工具,持续提升鸿蒙应用的创新体验与开发效率。 在这生态共建的浪潮中,货拉拉积极贡献了其在鸿蒙应用开发过程中的宝贵经验与技术积累,开源了两款实用三方——AspectPr
    的头像 发表于 08-26 14:02 713次阅读
    货拉拉<b class='flag-5'>开源</b>两款<b class='flag-5'>三方</b><b class='flag-5'>库</b>,为鸿蒙应用高效开发贡献力量

    飞书富文本组件RichTextVista开源

    近日,飞书正式将其自研的富文本组件 RichTextVista(简称“RTV”)开源,并上线OpenHarmony 三方中心仓。该组件以领先的性能、流畅的渲染体验与高度的开放性,为
    的头像 发表于 07-16 16:47 1245次阅读

    开源鸿蒙应用技术组件共建计划启动

    通过兼容性测评,覆盖金融、交通、教育、医疗、航天等多个行业领域,已成为发展速度最快的开源操作系统之。截至目前,开源鸿蒙已累计发布 8 个大版本,共建共享15个技术域的1115款开源
    的头像 发表于 06-05 14:33 1211次阅读