相关问题
场景
如果你手上的so库是适用于ArkTs的(类似于Node的 C/C++ addons with N-API),就可以使用以下方法引入。如果是纯c++ so库,想要在Native c++模块引用,可以移步鸿蒙开发Native C++模块如何引用so库。
名词说明
Module
是指的需要引用so库的模块;适用于ArkTs的so库
是指so库已经包含了napi的接口,暴露给ArkTs的napi相关的代码已经封装在so库中了,这种情况下so库提供方除了so库还会包含index.d.ts
和oh-package.json5
两个so库声明文件;
项目配置步骤
引用适用于ArkTs的so库
主要分为两步,so库引用和so库方法声明。
一、so库引用
把so库
放到Module目录下的libs(如果没有则创建)下对应的架构目录中,一般so库生成的时候,会有libc++_shared.so,
这个公共依赖库也要放到对应的架构目录中。
然后直接在代码中使用:
import xxx from 'libxxx.so'
//方法调用
xxx.add(1,2)
通过上面的方法就可以正常运行了,但是缺少方法声明,编译器不知道方法的如何定义的,也就是没有智能提示。
二、so库方法声明
通过上述方法后,so库能正常调用,但是调用方法的时候没有智能提示,我们需要把方法声明暴露给编译器。
一般so库生成后会还有附带两个文件index.d.ts
和oh-package.json5
//index.d.ts
export const add: (a: number, b: number) => number;
///oh-package.json5
{
"name": "libtestnative.so",
"types": "./index.d.ts",
"version": "",
"description": "Please describe the basic information."
}
- 将上述两个文件copy到
Module/src/main/cpp/types/libtestnative
(libtestnative是so库的名称,没有的文件夹需要自行创建)。 - Module目录下的
oh-package.json5
添加依赖
{
...
"devDependencies": {
"@types/libtestnative.so": "file:./src/main/cpp/types/libtestnative"
},
...
}
- 同步oh-package.json5之后,会发现Module下的
oh-modules/@types
多了一个libtestnative.so
, 至此so库方法声明成功。