色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    2369

    瀏覽量

    42900
  • OpenHarmony
    +關注

    關注

    25

    文章

    3728

    瀏覽量

    16396

原文標題:【開源三方庫】Aki:一行代碼極簡體驗JS&C++跨語言交互

文章出處:【微信號:gh_e4f28cfa3159,微信公眾號:OpenAtom OpenHarmony】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    EE-303:將VisualDSP線程安全與第三方RTOS配合使用

    電子發燒友網站提供《EE-303:將VisualDSP線程安全與第三方RTOS配合使用.pdf》資料免費下載
    發表于 01-07 14:09 ?0次下載
    EE-303:將VisualDSP線程安全<b class='flag-5'>庫</b>與第<b class='flag-5'>三方</b>RTOS配合使用

    AKI語言調用神助攻C/C++代碼遷移至HarmonyOS NEXT

    語言調用,成為開發者和廠商面臨的重要挑戰。為解決這痛點,款名為AKI (Alpha Kernel Interacting)的
    發表于 01-02 17:08

    ARM開發板編程語言選擇

    提供了對硬件的直接控制能力,可以生成緊湊、高效的代碼平臺:C語言具有很好的平臺特性,可以在多種操作系統和硬件平臺上運行。 豐富的
    的頭像 發表于 11-05 11:14 ?382次閱讀

    鴻蒙Flutter實戰:05-使用第三方插件

    # 鴻蒙Flutter 實戰:使用第三方插件 在鴻蒙Flutter開發中,如果涉及到使用原生功能,就要使用插件。使用插件有兩種方式,種是自己編寫原生ArkTS代碼,在Dart側調用。另外
    發表于 10-22 21:54

    鴻蒙端實踐-JS虛擬機架構實現

    在Roma端方案中,JS虛擬機是框架的核心,負責執行動態化的JS代碼。在Android平臺采用了基于V8的J2V8,iOS平臺則使用了系統自帶的JSCore,而在HarmonyOS中
    的頭像 發表于 09-30 14:42 ?2447次閱讀
    鴻蒙<b class='flag-5'>跨</b>端實踐-<b class='flag-5'>JS</b>虛擬機架構實現

    種常用嵌入式開發代碼

    使用開源協議:GPL-2.0varch簡介varch(we-architecture,意為我們的框架)是嵌入式C語言常用代碼模塊
    的頭像 發表于 09-04 08:06 ?501次閱讀
    <b class='flag-5'>一</b>種常用嵌入式開發<b class='flag-5'>代碼</b><b class='flag-5'>庫</b>

    維天地低代碼開發平臺助力第三方質檢行業數據可視化

    三方檢驗是由獨立于買賣雙方利益之外的第三方機構(例如專業的監督檢驗機構)執行的,這些機構以公正、公平、權威的非當事人身份,依據雙方共同認可的法律、標準和合同等進行商品的符合性檢驗和認證活動
    的頭像 發表于 08-09 13:59 ?294次閱讀
    <b class='flag-5'>三</b>維天地低<b class='flag-5'>代碼</b>開發平臺助力第<b class='flag-5'>三方</b>質檢行業數據可視化

    芯、EDA2、華為云三方簽署戰略合作框架協議

    EDA2的秘書處代表鄭云升先生介紹了簽約背景。EDA2于去年12月在無錫發布“碧玄巖”評測中心。EDA2、芯、華為云三方各有自身優勢,此次戰略合作是為了實現優勢互補、共同提升EDA質量,建立用戶
    的頭像 發表于 08-01 11:43 ?1363次閱讀

    c語言怎么做可視化界面

    介紹如何使用C語言開發可視化界面,包括所需的、工具和開發步驟。 選擇合適的圖形 為了在C語言
    的頭像 發表于 06-06 10:46 ?2400次閱讀

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

    自己在網上搜了下相關資料,能把第三方EXE內嵌進入容器里,但是有個問題,這個第三方軟件必須手動拖到容器正中間,手動最大化。請問有什么方法可以自動實現嗎? 下圖是我內嵌的POLL 軟件。如圖!
    發表于 04-18 14:26

    鴻蒙OS開發學習:【第三方調用】

    在Stage模型中,如何調用已經上架到[三方中心]的社區和項目內創建的本地
    的頭像 發表于 04-14 11:34 ?928次閱讀
    鴻蒙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 ?765次閱讀

    Meta Quest頭顯將支持多款安卓第三方應用并行

    Meta已悄然啟動了與此相關的功能,意味著Quest頭顯可同時操作多個第三方Android應用。在此之前,Quest對第三方Android應用有嚴格限制,用戶每次僅能打開個,無法實現同屏幕并行多個第
    的頭像 發表于 03-11 10:58 ?770次閱讀
    主站蜘蛛池模板: 四虎永久在线精品国产免费| 国产ZZJJZZJJ视频全免费| 18女下面流水不遮网站免费| MELODY在线播放无删减| 精品无码国产AV一区二区三区| 亚洲日韩成人| 乱子伦在线观看中文字幕| 亚洲精品久久7777777| 久久久精品久久| 女性BBWBBWBBWBBW| 中文字幕无码他人妻味| 精品一产品大全| 91综合久久久久婷婷| 日日啪无需播放器| 宫交拔不出来了h黑人| 日本邪恶全彩工囗囗番海贼王| 99久久热视频只有精品| 色狗综合网| 精品久久久久中文字幕日本| 中文字幕在线久热精品| 老人洗澡自拍xxx互摸| YELLOW视频在线观看免费版高清| 乌克兰14一18处交见血| 国产精品人妻一区免费看8C0M| 视频专区亚洲欧美日韩| 精品国产福利在线视频| YELLOW日本动漫高清免费| 亚洲精品久久久久久久蜜臀老牛| 免费韩伦影院在线观看| 99久久久国产精品免费调教| 天天拍拍国产在线视频| 两个洞一起插哦!好刺激| 国产精品青青在线麻豆| 在线观看黄色小说| 色青青草原桃花久久综合| 久久婷婷色香五月综合激情| 国产精品 日韩精品 欧美| 97人妻精品全国免费视频| 亚洲精品久久久久无码AV片软件| 青草国产超碰人人添人人碱| 久久精品国产亚洲AV麻豆欧美玲|