點擊藍字 ╳ 關注我們
郭振雄
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】歡迎添加關注!文章轉載請注明出處。
-
鴻蒙
+關注
關注
57文章
2369瀏覽量
42900 -
OpenHarmony
+關注
關注
25文章
3728瀏覽量
16396
原文標題:【開源三方庫】Aki:一行代碼極簡體驗JS&C++跨語言交互
文章出處:【微信號:gh_e4f28cfa3159,微信公眾號:OpenAtom OpenHarmony】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論