实现ArkTs到Native的跨模块调用module1(ArkTs->Native)->module2(Native->ArkTs->Native)
实现ArkTs到Native的跨模块调用module1(ArkTs->Native)->module2(Native->ArkTs->Native)
HarmonyOS
赞
收藏 0
回答 1
待解决
相关问题
Native调用ArkTS侧类函数
870浏览 • 1回复 待解决
HarmonyOS ArkTS调用Native接口机制咨询
355浏览 • 1回复 待解决
Native如何调ArkTS的方法
2093浏览 • 1回复 待解决
Native Module之间依赖如何配置
890浏览 • 1回复 待解决
arkts侧hashmap转为native侧
874浏览 • 1回复 待解决
如何在Native侧调用ArkTS侧异步方法,并获取异步计算结果到Native侧
2382浏览 • 1回复 待解决
在Native侧调用ArkTS的全局普通方法
826浏览 • 1回复 待解决
如何在Native侧释放ArkTS对象
2260浏览 • 1回复 待解决
在Native侧进行跨模块加载
729浏览 • 1回复 待解决
HarmonyOS ArkTS注册Native C函数监听
250浏览 • 1回复 待解决
ArkTS和Native互传数组类型数据
1159浏览 • 1回复 待解决
ArkTS和Native如何动态加载、卸载so
1893浏览 • 1回复 待解决
在Native侧释放ArkTS对象的方法
356浏览 • 1回复 待解决
ArkTS与Native(C/C++/Rust)通过什么方式实现调用交互
2073浏览 • 1回复 待解决
ArkTs怎么传递对象或者类给Native
2198浏览 • 1回复 待解决
ArkTS侧如何接收Native侧的键值对进行修改并返回到Native侧
2216浏览 • 1回复 待解决
从ArkTs向Native传复杂参数--- HashMap参数篇
1301浏览 • 1回复 待解决
Native Module依赖怎么配置且支持源码调试?
55浏览 • 1回复 待解决
如何在Native侧构建一个ArkTS对象
2028浏览 • 1回复 待解决
从ArkTs向Native传复杂参数---List参数篇
752浏览 • 1回复 待解决
ArkTS侧与Native侧如何进行map数据交互
2125浏览 • 1回复 待解决
ArkTS中如何使用编译出来的Native so库
349浏览 • 1回复 待解决
如何在Native侧C++子线程直接调用ArkTS接口,不用通过ArkTS侧触发回调
2007浏览 • 1回复 待解决
从ArkTs向Native传复杂参数-Reflect及Class篇
1033浏览 • 1回复 待解决
ArkTS侧与Native侧分别如何动态加载SO库
2350浏览 • 1回复 待解决
1.使用场景和背景
在大型应用开发中往往是由多个业务组共同完成一个APP的开发,每个业务组都有自己的工程,业务组会以HSP或HAR包的形式提供SDK能力给各个HAP模块使用,这些SDK往往会提供C++接口供其他模块的Native层直接调用,具体如下图:
2.实现方案
整个调用链为module1 ArkTs -> module1 Native -> module2 Native -> module2 ArkTs -> module2 Native。
1. module1 ArkTs调用module1 Native,通过本地Native调用即可。
2. module1 Native调用module2 Native需要将module2的头文件导出,并在module1中添加so依赖,然后通过头文件引用。
3. module2 Native调用module2 ArkTs通过napi_load_module_with_info来加载自定义ets模块,加载时需要env信息,从module1传下来。
4. module2 ArkTs调用module2 Native方法,同1,通过本地Native调用即可。
3.代码实现
下面按照第2章中介绍的4个部分来看具体的代码实现。本文中moudule1是调用方,模块名为app,module2是被调用方,模块名是lib。
3.1 module1 ArkTs调用module1 Native
(1)module1中定义Native方法
在HAP模块中定义invokeModule1Native方法,并在Init中注册。
(2)在module1中的Index.d.ts中导定义的Native方法。
(3)在module1中的Index.ets中调用Native方法。
3.2 module1 Native调用module2 Native
项目中的跨模块native到native的调用实际就是C++侧调用,和传统的C++调用类似,都是依赖头文件然后调用头文件中的方法,稍微有点区别的是被调用的模块需要申明导出头文件。
在本文场景中,module1是调用模块,module2是被调用的模块。
(1)在被调用模块module2中定义native方法在HSP/HAR包中napi_ini.cpp统计目录下新建napi_ini.h头文件,并定义invokeModule2Native Native方法,在napi_ini.cpp定义实现。
(2) 在module2中的build-profile.json5中配置头文件导出。
(3)在module2的CMakeLists.txt中配置将源文件打包到so。
(4)在module1中的CMakeLists.txt中配置so依赖。
(5)在module1的napi_init.cpp中导入module2的头文件并调用其Native方法。
3.3 module2 Native调用module2 ArkTs
在Native层使用napi方法napi_load_module_with_info加载ets模块,需要napi_env环境变量,而当前场景下是直接从module1的Native调用到module2的Native,所以需要从module1中将napi_env传递到module2中。
(1)在module1的Init方法中传递napi_env
在module2中定义setenv方法,并在module1中的napi_init.cpp中的Init方法中调用setenv方法将module1中的napi_env传递到module2中。
(2) 实现invokeModule2Native,通过napi_load_module_with_info加载自定义ets并完成调用在module2的ets目录下新建Util.ets。
3.4 module2 ArkTs调用module2 Native方法。
在module2 ArkTs调用module2 Native方法和3.1中一样,定义native方法并导出,在Util.ets中调用即可。
(1)在module2中定义Native方法并注册。
(2)导出module2中定义的Native方法。
(3)在module2中的Util.ets中调用Native方法。
4. 运行效果
5. module2为HSP/HAR时的差异点
module2模块可以是HSP,也可以是HAR,当是HAR时,除了在第3步module2 Native调用module2 ArkTs这里有一些区别外,其他地方都是一样的流程。
当module2是HAR时,在第3步module2 Native调用module2 ArkTs流程中,使用napi_load_module_with_info加载ArkTs模块时,第2,3两个参数的填写需要注意。napi_load_module_with_info的第二个参数表示要加载的ets模块的文件,其中第一个字符串是模块的名称(如lib/src/main/ets/Util中的lib),第二个参数是项目bundlename+入口模块名称(如com.tencent.demo.my_application/lib)。
(1)module2是HAR从上面这个图可以看出HAR是集成到HAP中的,入口模块是HAP,napi_load_module_with_info中第2个参数的模块名称要填HAP模块中oh-package.json5中定义的依赖HAR的名称,而不是HAR模块的实际名称。比如HAP的名称为app,HAR的名称为lib,HAP中定义依赖为:
那么napi_load_module_with_info的第一个参数应该写为folder/src/main/ets/Util,而不是lib/src/main/ets/Util,第3个参数也应该写为com.tencent.demo.my_application/app,而不是com.tencent.demo.my_application/lib。
(2)module2是HSP,HSP是独立的模块,入口模块就是自己,所以napi_load_module_with_info第2个参数的模块名就是自己的模块名,即lib/src/main/ets/Util,第3个参数的入口模块名也是自己,即com.tencent.demo.my_application/lib。