HarmonOS实战开发:Node-API接口适配模块加载指导

Node-API中的napi_load_module_with_info接口的功能是进行模块的加载,当模块加载出来之后,可以使用函数napi_get_property获取模块导出的变量,也可以使用napi_get_named_property获取模块导出的函数,该函数可以在新创建的ArkTs基础运行时环境中使用

函数说明

napi_status napi_load_module_with_info(napi_env env,const char* path,const char* module_info,napi_value* result);
参数说明
env当前的虚拟机环境
path加载的文件路径或者模块名
module_infobundleName/moduleName的路径拼接
result加载的模块

注意

  1. bundleName表示AppScope/app.json5中配置的工程名
  2. moduleName指的是待加载模块所在的HAP下module.json5中配置的名字
  3. napi_load_module只局限于在主线程中进行模块加载

napi_load_module_with_info支持的场景

场景详细分类说明
本地工程模块HAP加载模块内文件路径要求路径以moduleName开头
本地工程模块HAP加载HAR模块名-
远程包HAP加载远程HAR模块名-
远程包HAP加载ohpm包名-
APIHAP加载@ohos.或 @system.-
模块Native库HAP加载libNativeLibrary.so-

注意

  1. 加载一个模块名,实际的行为是加载该模块的入口文件,一般为index.ets/ts。
  2. 如果在HAR中加载另外一个HAR,需要确保module_info的配置正确,尤其注意moduleName应为HAP的moduleName。
  3. 如果在HAP/HSP中直接或间接使用了三方包,该三方包中使用napi_load_module_with_info接口加载其他模块A,则需要在HAP/HSP中也添加A的依赖。

使用示例

  • HAP加载模块内文件路径

当加载文件中的模块时,如以下ArkTS代码:

//./src/main/ets/Test.ets
let value = 123;
function test() {console.log("Hello HarmonyOS");
}
export {value, test};
  • 需要在工程的build-profile.json5文件中进行以下配置
{"buildOption" : {"arkOptions" : {"runtimeOnly" : {"sources": ["./src/main/ets/Test.ets"]}}}
}
  • 使用napi_load_module_with_info加载Test文件,调用函数test以及获取变量value
static napi_value loadModule(napi_env env, napi_callback_info info) {napi_value result;//1. 使用napi_load_module_with_info加载Test文件中的模块napi_status status = napi_load_module_with_info(env, "entry/src/main/ets/Test", "com.example.application/entry", &result);napi_value testFn;//2. 使用napi_get_named_property获取test函数napi_get_named_property(env, result, "test", &testFn);//3. 使用napi_call_function调用函数testnapi_call_function(env, result, testFn, 0, nullptr, nullptr);napi_value value;napi_value key;std::string keyStr = "value";napi_create_string_utf8(env, keyStr.c_str(), keyStr.size(), &key);//4. 使用napi_get_property获取变量valuenapi_get_property(env, result, key, &value);return result;
}
  • HAP加载HAR模块名

HAR包Index.ets文件如下

//library Index.ets
let value = 123;
function test() {console.log("Hello HarmonyOS");
}
export {value, test};

在加载本地HAR包时,首先需要在oh-package.json5文件中配置dependencies项

{"dependencies": {"library": "file:../library"}
}

其次,还需要在build-profile.json5中进行配置

{"buildOption" : {"arkOptions" : {"runtimeOnly" : {"packages": ["library"]}}}
}

用napi_load_module_with_info加载library,调用函数test以及获取变量value

static napi_value loadModule(napi_env env, napi_callback_info info) {napi_value result;//1. 使用napi_load_module_with_info加载librarynapi_status status = napi_load_module_with_info(env, "library", "com.example.application/entry", &result);napi_value testFn;//2. 使用napi_get_named_property获取test函数napi_get_named_property(env, result, "test", &testFn);//3. 使用napi_call_function调用函数testnapi_call_function(env, result, testFn, 0, nullptr, nullptr);napi_value value;napi_value key;std::string keyStr = "value";napi_create_string_utf8(env, keyStr.c_str(), keyStr.size(), &key);//4. 使用napi_get_property获取变量valuenapi_get_property(env, result, key, &value);return result;
}
  • HAP加载远程HAR模块名

在远程HAR模块名时,首先需要在oh-package.json5文件中配置dependencies项

{"dependencies": {"@ohos/hypium": "1.0.16"}
}

其次,还需要在build-profile.json5中进行配置

{"buildOption" : {"arkOptions" : {"runtimeOnly" : {"packages": ["@ohos/hypium"]}}}
}

用napi_load_module_with_info加载@ohos/hypium,获取DEFAULT变量

static napi_value loadModule(napi_env env, napi_callback_info info) {napi_value result;//1. 使用napi_load_module_with_info加载@ohos/hypiumnapi_status status = napi_load_module_with_info(env, "@ohos/hypium", "com.example.application/entry", &result);napi_value key;std::string keyStr = "DEFAULT";napi_create_string_utf8(env, keyStr.c_str(), keyStr.size(), &key);//2. 使用napi_get_property获取DEFAULT变量napi_value defaultValue;napi_get_property(env, result, key, &defaultValue);return result;
}
  • HAP加载ohpm包名

在加载ohpm包时,首先需要在oh-package.json5文件中配置dependencies项

{"dependencies": {"json5": "^2.2.3"}
}

其次,还需要在build-profile.json5中进行配置

{"buildOption" : {"arkOptions" : {"runtimeOnly" : {"packages": ["json5"]}}}
}

用napi_load_module_with_info加载json5,调用函数stringify

static napi_value loadModule(napi_env env, napi_callback_info info) {napi_value result;//1. 使用napi_load_module_with_info加载json5napi_status status = napi_load_module_with_info(env, "json5", "com.example.application/entry", &result);napi_value key;std::string keyStr = "default";napi_create_string_utf8(env, keyStr.c_str(), keyStr.size(), &key);//2. 使用napi_get_property获取default对象napi_value defaultValue;napi_get_property(env, result, key, &defaultValue);napi_value stringifyFn;//3. 使用napi_get_named_property获取stringify函数napi_get_named_property(env, defaultValue, "stringify", &stringifyFn);//4. 使用napi_call_function调用函数stringifynapi_value argStr;std::string text = "call json5 stringify";napi_create_string_utf8(env, text.c_str(), text.size(), &argStr);napi_value args[1] = {argStr};napi_value returnValue;napi_call_function(env, defaultValue, stringifyFn, 1, args, &returnValue);return result;
}
  • HAP加载API模块
static napi_value loadModule(napi_env env, napi_callback_info info) {//1. 使用napi_load_module_with_info加载模块@ohos.hilognapi_value result;napi_status status = napi_load_module_with_info(env, "@ohos.hilog", nullptr, &result);//2. 使用napi_get_named_property获取info函数napi_value infoFn;napi_get_named_property(env, result, "info", &infoFn);napi_value tag;std::string formatStr = "test";napi_create_string_utf8(env, formatStr.c_str(), formatStr.size(), &tag);napi_value outputString;std::string str = "Hello HarmonyOS";napi_create_string_utf8(env, str.c_str(), str.size(), &outputString);napi_value flag;napi_create_int32(env, 0, &flag);napi_value args[3] = {flag, tag, outputString};//3. 使用napi_call_function调用info函数napi_call_function(env, result, infoFn, 3, args, nullptr);return result;
}
  • HAP加载Native库

libentry.so的index.d.ts文件如下

//index.d.ts
export const add: (a: number, b: number) => number;

在加载本地so库时,首先需要在oh-package.json5文件中配置dependencies项

{"dependencies": {"libentry.so": "file:../src/main/cpp/types/libentry"}
}

其次,还需要在build-profile.json5中进行配置

{"buildOption" : {"arkOptions" : {"runtimeOnly" : {"packages": ["libentry.so"]}}}
}

用napi_load_module_with_info加载libentry.so,调用函数add

static napi_value loadModule(napi_env env, napi_callback_info info) {napi_value result;//1. 使用napi_load_module_with_info加载libentry.sonapi_status status = napi_load_module_with_info(env, "libentry.so", "com.example.application/entry", &result);napi_value addFn;//2. 使用napi_get_named_property获取add函数napi_get_named_property(env, result, "add", &addFn);napi_value a;napi_value b;napi_create_int32(env, 2, &a);napi_create_int32(env, 3, &b);napi_value args[2] = {a, b};//3. 使用napi_call_function调用函数addnapi_value returnValue;napi_call_function(env, result, addFn, 2, args, &returnValue);return result;
}
  • HAR加载HAR模块名

场景为har1加载har2,har2中的Index.ets文件如下

//har2 Index.ets
let value = 123;
function test() {console.log("Hello HarmonyOS");
}
export {value, test};

在加载har2时,首先需要在har1中的oh-package.json5文件中配置dependencies项

{"dependencies": {"har2": "file:../har2"}
}

其次,还需要在har1的build-profile.json5文件中进行配置

{"buildOption" : {"arkOptions" : {"runtimeOnly" : {"packages": ["har2"]}}}
}

在har1中用napi_load_module_with_info加载har2,调用函数test以及获取变量value

static napi_value loadModule(napi_env env, napi_callback_info info) {napi_value result;//1. 使用napi_load_module_with_info加载har2,注意这里的moduleName为模块所在HAP包的moduleNamenapi_status status = napi_load_module_with_info(env, "har2", "com.example.application/entry", &result);napi_value testFn;//2. 使用napi_get_named_property获取test函数napi_get_named_property(env, result, "test", &testFn);//3. 使用napi_call_function调用函数testnapi_call_function(env, result, testFn, 0, nullptr, nullptr);napi_value value;napi_value key;std::string keyStr = "value";napi_create_string_utf8(env, keyStr.c_str(), keyStr.size(), &key);//4. 使用napi_get_property获取变量valuenapi_get_property(env, result, key, &value);return result;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/53099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣239题详解:滑动窗口最大值的多种解法与模拟面试问答

在本篇文章中,我们将详细解读力扣第239题“滑动窗口最大值”。通过学习本篇文章,读者将掌握如何在数组中找到每个滑动窗口的最大值,并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释,以便于理解。 问题描述 力…

SprinBoot+Vue学生选课微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平…

C++使用日志库经验总结

1、log4cpp日志源文件路径设置 在 Visual Studio 中,C 项目的日志格式可以通过设置项目的属性来调整。如果你想要使用完整路径来显示诊断消息,可以在项目属性中的“C/C”选项卡下的“高级”属性页中找到“使用完整路径”(/FC)选项…

探索数字化生态平台的特色功能,开启未来新征程

在数字化浪潮席卷全球的今天,数字化生态平台正以惊人的速度崛起,成为推动经济发展与社会进步的强大引擎。那么,这些平台究竟有哪些独特的特色功能呢?让我们一同深入探索。 首先,我们要明确数字化生态平台的定义。它是利…

ParallelsDesktop19可在任何Mac上运行Windows软件

ParallelsDesktop19是一款Mac虚拟机软件,可在任何Mac上运行Windows,体验不同操作系统之间的无缝集成,并具有创新设计和增强功能,如无密码登录与TouchID、支持macOSSonoma14和增强打印选项。此外,它还支持运行更多Windo…

第二证券:大洗牌!头部券商营收、净利集体下滑

前十券商营收团体下滑,银河证券跌幅最小 新股IPO数量锐减129家至44家,国内证券市场股票基金交易量日均规划 同比下降 6.83%……关于证券公司而言,本年上半年可谓多重要素叠加冲击,成果下滑难以避免。于大多数证券公司而言&#x…

01、echart的基本使用

一 为什么使用echarts 丰富的可视化类型(柱状图、散点图、雷达图…) 多种数据格式无需转换直接使用 千万数据的前端展现移动端优化 多渲染方案,跨平台 动态数据 绚丽的特效 二echarts快速上手 方式一: 从gi thup中下载ech…

未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序

未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序 或者 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序 Language: C# Database: Access 解决方案: Microsoft.ACE.OLEDB.12.0 官方下载地址 https://www.microsoft.com/en-us/download/details.…

强化学习与深度学习的结合

强化学习与深度学习的结合 目录 一、引言 二、强化学习基础 三、深度学习基础 四、强化学习与深度学习的结合实例 五、总结 一、引言 随着人工智能技术的不断发展,强化学习已经成为了计算机科学领域的一个重要分支。而深度学习作为一种强大的机器学习方…

redroid搭建云手机学习笔记(一)

参考链接 通过Redroid搭建自己的云手机 docker安装 docker官网目前打不开了,通过官网安装的方式无法实现,这里需要借助镜像网站来实现docker的安装 参考链接:https://developer.aliyun.com/mirror/docker-ce # step 1: 安装必要的一些系统…

如何克服编程学习中的挫折感的?

你是如何克服编程学习中的挫折感的? 在编程学习的道路上,遭遇挫折感几乎是每位学习者不可避免的经历。无论是初学者在基础语法上的反复磕碰,还是进阶者在复杂算法、系统设计前的迷茫与困惑,挫折感都是成长路上的一个重要伴侣。然…

BPE - Byte Pair Encoding

动机 对于LLM,对text进行tokenize最原始的想法是每个词对应一个编号。但一旦语言变多,token list映射表就会特别大,因此需要一种数据压缩方法去减少token list size 算法 计算相邻字符的组合出现频率,频率最高(假设…

Python使用zdppy_mysql操作MySQL和MariaDB数据库快速入门教程

zdppy_mysql 使用python操作MySQL 项目开源地址:https://github.com/zhangdapeng520/zdppy_mysql 安装 pip install zdppy_mysql使用教程 连接MySQL import zdppy_mysql from config import host, username, password, database, port# 连接数据库 db zdppy_…

强化学习实操入门随笔

碎碎念:经过思考,打通底层逻辑,我认为未来ai的功能是在沟通领域代替人,未来人-人模式(媒介是死的语言,比如看古人留下的文字、聊天的暂时不在)会变成人-ai替身-人模式(符合本人想法的…

AI推介-多模态视觉语言模型VLMs论文速览(arXiv方向):2024.08.10-2024.08.15

文章目录~ 1.Towards Flexible Visual Relationship Segmentation2.When Video Coding Meets Multimodal Large Language Models: A Unified Paradigm for Video Coding3.Do Vision-Language Foundational models show Robust Visual Perception?4.IFShip: A Large…

selenium(一)基于java、元素定位

Selenium自动化 Selenium是一个用于Web应用程序的自动化测试工具。它直接运行在浏览器中,可以模拟用户在浏览器上面的行为操作。 chrome下载 https://www.google.com/chrome/ 下载的结果是 “ChromeSetup.exe”,双击该文件,安装程序会自…

1、Java简介+DOS命令+java的编译运行(字节码/机器码、JRE/JVM/JDK/JIT的区别)+一个简单的Java程序

前言:本文属于黑马程序员和javaguide的混合笔记,仅作学习分享使用,建议感兴趣的小伙伴去看黑马原视频或javaguide原文。如有侵权,请联系删除。 Java类型: JavaSE 标准版:以前称为J2SE,主要用来…

网站开发:HTML+CSS - 表格与表单

1. 前言​​​​​​​​​​​​​​ 表格与表单在网页开发中非常重要。表格使得用户可以更简洁清晰的去浏览信息。 表单提供了一种在客户端(浏览器)和服务器之间进行数据交互的方式。 以下为其主要作用: 用户交互和数据输入:表…

Android Audio分区——音频分区加载流程(三)

前面文章介绍了车载多区音频基础,并且介绍了音频分区相关类及对应功能,这里我们就来看一下音频分区的解析过程。 一、音频分区加载 音频分区的加载是在 CarAudioService 的初始化函数 init() 流程中进行的。 1、CarAudioService.java 源码位置&#x…

【ragflow】安装2:源码安装依赖

中文文档【ragflow】安装1: docker:失败官方说的成功 docker 安装的启动失败 重新来一遍,不会重新拉取: root@k8s-master-pfsrv:/home/zhangbin/perfwork/rag# cd ragflow/ root@k8s-master-pfsrv:/home/