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

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

    关注

    55

    文章

    1641

    浏览量

    42123
  • OpenHarmony
    +关注

    关注

    23

    文章

    3322

    浏览量

    15161

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

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

收藏 人收藏

    评论

    相关推荐

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

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

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

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

    【坚果派】JS开源库适配OpenHarmony系列——第一期实操

    由于OpenHarmony应用是基于ArkTS开发,而ArkTS是在保持TypeScript(简称TS)基础语法风格的基础上,对TS的动态类型特性施加更严格的约束,引入静态类型。因此在开发OpenHarmony三方库时,建议首选在成熟的JS/TS
    的头像 发表于 12-26 10:48 506次阅读
    【坚果派】<b class='flag-5'>JS</b><b class='flag-5'>开源</b>库适配OpenHarmony系列——第一期实操

    js文件可以直接浏览器运行吗

    载和运行。 在Web开发中,JS常被用于实现动态交互效果和页面逻辑控制。通过将JS代码嵌入到网页的HTML文件中,浏览器可以在页面加载过程中自动执行
    的头像 发表于 11-27 16:45 1584次阅读

    c语言怎么把代码全部注释掉

    要将C语言代码全部注释掉,即不让代码被编译和执行,可以使用注释语句来实现。C语言提供两种注释方式:单行注释和多行注释。 单行注释:使用双斜杠(//)来注释
    的头像 发表于 11-22 10:21 2399次阅读

    OpenAtom OpenHarmony 三方创建发布及安全隐私检测

    根据其开发语言分为2种,种是使用JavaScript和TypeScript语言三方,通常以源码或OpenHarmony HAR/HSP
    发表于 11-13 17:27

    OpenHarmony创新赛丨报名倒计时,超强秘籍带你直通大奖!

    加密算法库的使用方法​​ ​​OpenHarmony 4.0 Beta2新版本发布邀您体验​​ ​​【开源三方】bignumber.js
    发表于 10-18 07:59

    开源三方】Fuse.js:强大、轻巧、零依赖的模糊搜索

    开源项目 OpenHarmony 是每个人的 OpenHarmony 曹天恒 公司:中国科学院软件研究所 小组:知识体系工作组 1.简介 Fuse.js款功能强大且轻量级的JavaScript
    发表于 10-12 15:05

    开源三方】crypto-js加密算法库的使用方法

    应用。如果是发布到开源社区,称为开源三方,开发者可以通过访问开源社区获取。接下来我们来了解crypto-
    发表于 09-08 15:10

    开源三方库】crypto-js加密算法库的使用方法

    OpenHarmony系统上可重复使用的软件组件,可帮助开发者快速开发OpenHarmony应用。如果是发布到开源社区,称为开源三方库,开发者可以通过访问开源社区获取。接下来我们来了解
    的头像 发表于 09-07 21:10 531次阅读

    开源三方】bignumber.js个大数数学

    OpenHarmony应用。如果是发布到开源社区,称为开源三方,开发者可以通过访问开源社区获取。接下来我们来了解bignumber.
    发表于 08-21 16:37

    开源三方库】bignumber.js:一个大数数学库

    解bignumber.js开源三方库。 bignumber.js是一个数学库,用于任意精度十进制和非十进制算术的 JavaScript库。 特点 • 整数和小数。 • 简单的API,但
    的头像 发表于 08-18 21:05 470次阅读

    面向万物智联的应用框架的思考与探索

    开发工具的整合,包括VSCode, 基于Chrome浏览器的调试等,进步方便开发者。 3.社区。这层主要是通过相应的开源社区(开放原子开源基金会等),以及三方
    发表于 08-08 17:04

    开源三方Aki一行代码简体JS&amp;C++语言交互

    :同步异步接口封装 示例期望将C++业务逻辑(GetName)注册为JS同步接口(getSync)、异步接口(getAsync),Aki提供了
    发表于 08-07 17:04

    RT-Thread操作系统有哪些优势?

    软件包和SDK,扩展系统功能 开发者说,RT-Thread是最简洁,优雅的开源操作系统之,简单易用。 RT-Thread 主要采用 C 语言编写,浅显易懂,方便移植。它把面向对象的设
    发表于 06-28 08:16