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

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

// 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"); // 綁定異步方法
}
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);
});
// 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); // 綁定類成員屬性
}
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();//調用類靜態函數
// 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);
}
import libsub_thread from 'libsub_thread.so';
// 入參為JS方法回調
libsub_thread.SafetyCallback((data) => {
console.error('test result = ' + data); // test result = aki
})
import libAddon from 'libaddon.so'
function createTable(table: string) {
rdbStore.executeSql()... // OHOS 關系型數據庫邏輯
}
libAddon.JSBind.bindFunction('createTable',createTable);//綁定JS函數
// C++邏輯
bool DoSomethingFromNative() {
if (auto createTable = aki::GetJSFunction("createTable")) {
createTable->Invoke<void>("MYSTORE"); // 入參類型 string
}
Aki支持豐富的類型轉換,幾乎所有JS的數據類型都可以通過Aki映射為同等的C/C++數據類型,開發者無需處理類型轉換,如上述示例用法,框架支持自動匹配類型轉換,下表為當前支持的完整類型轉換關系:

三、集成依賴Aki
File > New > Create Project | Module
cd entry
ohpminstall@ohos/aki
...
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) # 鏈接二進制依賴
...
cd entry/src/main/cpp
gitclonehttps://gitee.com/openharmony-sig/aki.git
...
add_subdirectory(aki)
target_link_libraries(entry PUBLIC aki_jsbind) // entry 為編譯目標
...
相關鏈接
《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】歡迎添加關注!文章轉載請注明出處。
-
鴻蒙
+關注
關注
59文章
2555瀏覽量
43852 -
OpenHarmony
+關注
關注
29文章
3842瀏覽量
18288
原文標題:【開源三方庫】Aki:一行代碼極簡體驗JS&C++跨語言交互
文章出處:【微信號:gh_e4f28cfa3159,微信公眾號:OpenAtom OpenHarmony】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
開源鴻蒙應用技術組件共建計劃啟動
DialogHub上線OpenHarmony開源社區,高效開發鴻蒙應用彈窗
越南副總理一行到訪商湯科技
鴻蒙文件傳輸三方庫上線開源鴻蒙社區 十行代碼實現大文件高速傳輸
HarmonyOS NEXT 原生應用/元服務調試概述
沐曦GPU跑通DeepSeek開源代碼庫FlashMLA
EE-303:將VisualDSP線程安全庫與第三方RTOS配合使用

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

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

評論