本文是经过实践验证深思总结而来,想交流的各位,请留言,开发、培训、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.运行结果:

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐