點擊藍字 ╳ 關(guān)注我們
郭振雄
OpenHarmony知識體系組
一、簡介

二、所鍵即所得:NAPI的盡頭就是Aki

// C++業(yè)務(wù)邏輯
std::string GetName(std::string key)
{
std::string result = ...... // 獲取數(shù)據(jù)的業(yè)務(wù)邏輯
return result; // 返回字符串類型
}
// Aki JSBind語法糖
JSBIND_ADDON(task_runner);
JSBIND_GLOBAL() {
JSBIND_FUNCTION(GetName, "getNameSync"); // 綁定同步方法
JSBIND_PFUNCTION(GetName, "getNameAsync"); // 綁定異步方法
}
import libtask_runner from 'libtask_runner.so';
const name = libstorage.getNameSync('name');// 調(diào)用同步方法
console.log('name is ' + name);
// 調(diào)用異步方法
libstorage.getNameAsync('name').then(date => {
console.log('name is ' + data);
}).catch(error => {
console.log('error: ' + error);
});
// C++邏輯
struct Person {
// 構(gòu)造函數(shù),用于JS側(cè) new 對象
Person(std::string name) : name(name) {}
// 靜態(tài)函數(shù)
static Person GetAllPerson(); // 支持類對象作為參數(shù)
// 成員函數(shù)
int SayHello();
std::string name;
};
// Aki JSBind語法糖
JSBIND_ADDON(person);
JSBIND_CLASS(Person) {
JSBIND_CONSTRUCTOR<std::string>(); // 綁定構(gòu)造函數(shù)
JSBIND_METHOD(GetAllPerson); // 綁定類靜態(tài)函數(shù)
JSBIND_METHOD(SayHello); // 綁定類成員函數(shù)
JSBIND_PROPERTY(name); // 綁定類成員屬性
}
import libperson from 'libperson.so';
let person = new libperson.Person("aki"); // 調(diào)用構(gòu)造函數(shù)
console.log('person name: ' + person.name); // 訪問類屬性
let greeting = person.SayHello(); // 調(diào)用類成員函數(shù)
letpersons=libperson.Person.GetAllPerson();//調(diào)用類靜態(tài)函數(shù)
// C++邏輯
void SafetyCallback(std::function<void (std::string)> callback) {
std::thread t([callback = std::move(callback)] () {
callback("aki"); // 線程安全,直接調(diào)用
});
t.detach();
}
// Aki JSBind語法糖
JSBIND_ADDON(sub_thread);
JSBIND_GLOBAL() {
JSBIND_FUNCTION(SafetyCallback);
}
import libsub_thread from 'libsub_thread.so';
// 入?yún)镴S方法回調(diào)
libsub_thread.SafetyCallback((data) => {
console.error('test result = ' + data); // test result = aki
})
import libAddon from 'libaddon.so'
function createTable(table: string) {
rdbStore.executeSql()... // OHOS 關(guān)系型數(shù)據(jù)庫邏輯
}
libAddon.JSBind.bindFunction('createTable',createTable);//綁定JS函數(shù)
// C++邏輯
bool DoSomethingFromNative() {
if (auto createTable = aki::GetJSFunction("createTable")) {
createTable->Invoke<void>("MYSTORE"); // 入?yún)㈩愋?string
}
Aki支持豐富的類型轉(zhuǎn)換,幾乎所有JS的數(shù)據(jù)類型都可以通過Aki映射為同等的C/C++數(shù)據(jù)類型,開發(fā)者無需處理類型轉(zhuǎn)換,如上述示例用法,框架支持自動匹配類型轉(zhuǎn)換,下表為當(dāng)前支持的完整類型轉(zhuǎn)換關(guān)系:

三、集成依賴Aki
File > New > Create Project | Module
cd entry
ohpminstall@ohos/aki
...
set(AKI_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules/@ohos/aki) # 設(shè)置AKI根路徑
set(CMAKE_MODULE_PATH ${AKI_ROOT_PATH})
find_package(Aki REQUIRED)
...
target_link_libraries(${YOUR_TARGET} PUBLIC Aki::libjsbind) # 鏈接二進制依賴
...
cd entry/src/main/cpp
gitclonehttps://gitee.com/openharmony-sig/aki.git
...
add_subdirectory(aki)
target_link_libraries(entry PUBLIC aki_jsbind) // entry 為編譯目標
...
相關(guān)鏈接
《Aki使用指導(dǎo)》
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使用指導(dǎo)
https://docs.openharmony.cn/pages/v4.0/zh-cn/application-dev/napi/napi-guidelines.md/
原文標題:【開源三方庫】Aki:一行代碼極簡體驗JS&C++跨語言交互
文章出處:【微信公眾號:OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
鴻蒙
+關(guān)注
關(guān)注
59文章
2531瀏覽量
43789 -
OpenHarmony
+關(guān)注
關(guān)注
27文章
3835瀏覽量
18177
原文標題:【開源三方庫】Aki:一行代碼極簡體驗JS&C++跨語言交互
文章出處:【微信號:gh_e4f28cfa3159,微信公眾號:OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
開源鴻蒙應(yīng)用技術(shù)組件共建計劃啟動
DialogHub上線OpenHarmony開源社區(qū),高效開發(fā)鴻蒙應(yīng)用彈窗
越南副總理一行到訪商湯科技
鴻蒙文件傳輸三方庫上線開源鴻蒙社區(qū) 十行代碼實現(xiàn)大文件高速傳輸
HarmonyOS NEXT 原生應(yīng)用/元服務(wù)調(diào)試概述
沐曦GPU跑通DeepSeek開源代碼庫FlashMLA
EE-303:將VisualDSP線程安全庫與第三方RTOS配合使用

AKI跨語言調(diào)用庫神助攻C/C++代碼遷移至HarmonyOS NEXT
上位機編程語言選擇 上位機在自動化中的作用
ARM開發(fā)板編程語言選擇
鴻蒙Flutter實戰(zhàn):05-使用第三方插件
鴻蒙跨端實踐-JS虛擬機架構(gòu)實現(xiàn)

三維天地低代碼開發(fā)平臺助力第三方質(zhì)檢行業(yè)數(shù)據(jù)可視化

評論