HarmonyOS 鸿蒙Next ArkTS 如何加载 so 文件?

HarmonyOS 鸿蒙Next ArkTS 如何加载 so 文件?
<markdown _ngcontent-cud-c237="" class="markdownPreContainer">

几个问题:

  • ArkTS 如何加载已有的 so(无 native 源码),有没有类似 Java System.loadLibrary 的方式?
  • 鸿蒙的项目,如果 liba.so 依赖了 libb.so,假设 liba.so 是我们自己的,我们调用到 libb.so 提供的 export 出来的 .h 文件的时候,是不是就已经把 libb.so 加载起来了,还用在 liba.so 里面使用 dlopen 吗?
  • 通过 index.d.ts 那一套固定写法加载的 libb.so 文件,和假设在一个 liba.so 里 dlopen 的 libb.so 文件,有什么不同吗?
</markdown>

更多关于HarmonyOS 鸿蒙Next ArkTS 如何加载 so 文件?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

更多关于HarmonyOS 鸿蒙Next ArkTS 如何加载 so 文件?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


我试了下,是可以的,但是前提要知道 so里的方法才能调用。如果我单纯只是想加载 so 呢(不调用任何方法)?

HarmonyOS 鸿蒙Next ArkTS学习:https://www.bilibili.com/video/BV1fw2ZYSEk2

配套课件及涉及源码网盘下载地址:http://bbs.itying.com/topic/6568836e6a4621002b88a6f6

放在libs里面默认就可以加载。然后印象中系统应该把dlopen禁掉了,如果有在native加载包的需求 提供了 napi_load_module

在HarmonyOS鸿蒙Next ArkTS中加载so文件,可以通过以下几种方式实现:

一、动态Import方式

ArkTS支持使用动态import来加载so文件。具体代码如下:

@Entry @Component struct Index {
    @State message: string = 'Hello World';
    build() {
        Row() {
            Column() {
                Text(this.message)
                    .fontSize(50)
                    .fontWeight(FontWeight.Bold)
                    .onClick(async () => {
                        let module = await import("libentry.so");
                        console.log(module.default.someFunction());
                    })
            }
            .width('100%')
        }
        .height('100%')
    }
}

其中,"libentry.so"是你要加载的so文件名,someFunction()是so文件中导出的函数。

二、Native层dlopen方式

在Native层,可以使用dlopen等标准库函数来加载so文件。首先,需要将so文件放置到正确的目录,如工程的libs目录下,并在CMakeLists.txt中配置好链接路径。然后,在Native代码中通过dlopen打开so文件,并使用dlsym获取需要的函数指针,最后调用该函数。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部