ArkTs项目直接引用纯c++的so库文件经典过程(全网最全解释最到位)----鸿蒙Next版
ArkTs项目直接引用纯c++的so库文件经典过程
本文是经过实践验证深思总结而来,想交流的各位,请留言,开发、培训、AI一体化。
一、前提条件:将众多c++的文件中的函数、类、数组、结构体等等都经过arkts的NDK处理并实现正常使用的so库文件,具有arkts文件中函数、类等需要的声明文件Index.d.ts文件,以及还具有so文件和类型Index.d.ts映射的模块配置文件oh-package.json5。
二、实现目标:将上面生成的so文件直接引入到当前的arkts的项目中,而且当前的项目创建不需要一定是通过native模版创建。
三、Arkts调用so库文件的过程:
Arkts的文件中在调用so中的函数的时,需要在该文件中事先导入so文件,例如:
import napi from 'libcpptoarkts.so'; (其中libcpptoarkts.so就是前提条件中生成的库文件);
页面中使用某函数时,会首先找导入的libcpptoarkts.so,真正查找的文件是该页面文件所在模块(以entry模块为例)中模块级的依赖配置文件entry\oh-package.json5,该文件中具有依赖的库名称和库文件声明的目录的映射:
{
"name": "entry",
"version": "1.0.0",
"description": "Please describe the basic information.",
"main": "",
"author": "",
"license": "",
"dependencies": {
"libcpptoarkts.so": "file:./src/main/cpp/types/libcpptoarkts" //映射内容
}
}
此时系统会再次找到/src/main/cpp/types/libcpptoarkts目录下的native的依赖配置文件src/main/cpp/types/libcpptoarkts/oh-package.json5,该文件中具有名称libcpptoarkts.so
和类型声明文件的对应关系,这样就可以找到Index.d.ts文件,文件中指出了该文件就在当前目录下,就是Index.d.ts:
{
"name": "libcpptoarkts.so", //名称
"types": "./Index.d.ts",//类型声明文件
"version": "1.0.0",
"description": "Please describe the basic information."
}
这样arkts页面中调用的函数名称就找到了出处,也就是声明的发源地Index.d.ts,到这里还是在arkts这一侧;
接下来Index.d.ts文件就根据src/main/cpp/types/libcpptoarkts/oh-package.json5配置文件中的对应关系去系统收集的库中查找库文件,而这个libcpptoarkts.so库文件,系统之所以能够收集到,也不是随意就可以放在任何地方使用的,需要放在模块目录下libs目录下对应cpu架构的目录下,并且还一定要有公共的库文件(公共库文件是nodeApi的功能库),这样,找到了这个so的库文件后,就可以将声明的函数与库文件中的node-api实现的arkts与c++转换的接口函数进行关联了,就可以使用到c++的函数去处理了(具体处理过程这里就不细讲了,这是NDK部分的内容了)。
至此,就完成了arkts项目直接调用so库文件的过程了。
四、具体实施实践过程:
1.在当前的arkts项目的entry模块中添加native的相关的文件:要有src/main/cpp目录,该目录下要有src/main/cpp/types/libcpptoarkts/Index.d.ts文件和src/main/cpp/types/libcpptoarkts/oh-package.json5文件。
2.在entry模块下要有libs目录(没有的话自行创建),在该目录下创建对应的cpu架构的目录,为了能够使 本地模拟器也能够使用可以创建x86_64目录,arm架构是arm64_v8a,将已经打包好的so库文件(包括公共库文件)一同放置在该目录下。
3.配置模块级依赖配置文件entry\oh-package.json5,使so库文件和类型声明依赖配置文件(为src/main/cpp/types/libcpptoarkts/oh-package.json5)目录建立映射(第三步已给出示例)。
4.配置native中依赖配置文件src/main/cpp/types/libcpptoarkts/oh-package.json5,将类型声明文件(其实就是函数声明、类声明等所在的文件)Index.d.ts和so库文件建立映射。
以上步骤中,要注意各个文件名的一致性,根据原理就可以知道哪些名称需要一致了。上面4个步骤中操作后的最终截图如下:

五、Arkts文件中使用so库文件:
1.导入so库文件:
import napi from 'libcpptoarkts.so';
2.直接使用:
3.运行结果:

更多推荐

所有评论(0)