ArkTS侧与Native侧分别如何动态加载SO库

ArkTS侧与Native侧分别如何动态加载SO库

HarmonyOS
2024-03-19 16:11:32
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
hujianwu

解决措施

1.ArkTS可通过动态import的方式动态加载so库。

2.Native侧可通过dlopen动态加载so库。

参考代码如下:

1.ArkTS可通过动态import的方式动态加载so库。添加异步函数,在异步函数中通过let testNapi = await import("libentry.so")实现动态加载so库。

import { hilog } from '@kit.PerformanceAnalysisKit'; 
// import testNapi from 'libentry.so'; 
 
@Entry 
@Component 
struct Index { 
  @State message: string = 'Hello World'; 
 
  build() { 
    Row() { 
      Column() { 
        Text(this.message) 
          .fontSize(50) 
          .fontWeight(FontWeight.Bold) 
          .onClick(async() => { 
            let testNapi = await import("libentry.so")            // 加载so库 
            hilog.info(0x0000, 'testTag', 'Test NAPI 2 + 3 = %{public}d', testNapi.default.add(2, 3));   // 通过default调用库函数 
            // hilog.info(0x0000, 'testTag', 'Test NAPI 2 + 3 = %{public}d', testNapi.add(2, 3)); 
          }) 
      } 
      .width('100%') 
    } 
    .height('100%') 
  } 
}

2.Native侧可通过dlopen动态加载so库。

假设这里我们需要调用liba.so中的add函数。

  • 首先需要将liba.so文件放到libs/arm64-v8a/路径下。

  •  然后需要我们在ArkTS侧传递so库路径信息到Native侧。
import { hilog } from '@kit.PerformanceAnalysisKit'; 
import testNapi from 'libentry.so'; 
 
@Entry 
@Component 
struct Index { 
  @State message: string = 'Hello World'; 
 
  build() { 
    Row() { 
      Column() { 
        Text(this.message) 
          .fontSize(50) 
          .fontWeight(FontWeight.Bold) 
          .onClick(() => { 
            let path = getContext(this).bundleCodeDir;     // 获取项目路径 
            hilog.info(0x0000, 'testTag', 'Test NAPI 2 + 3 = %{public}d', testNapi.add(2, 3, path + '/libs/arm64/liba.so'));   // 传递参数路径信息到Native侧 
          }) 
      } 
      .width('100%') 
    } 
    .height('100%') 
  } 
}
  • 然后在Native侧通过dlopen函数动态加载so库
#include "napi/native_api.h" 
#include <dlfcn.h> 
typedef double (*FUNC_ADD)(int, int); 
static napi_value Add(napi_env env, napi_callback_info info) { 
    size_t requireArgc = 3; 
    size_t argc = 3; 
    napi_value args[3] = {nullptr}; 
    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 
    double value0; 
    napi_get_value_double(env, args[0], &value0); 
    double value1; 
    napi_get_value_double(env, args[1], &value1); 
    char path[255]; 
    size_t size = 255; 
    napi_get_value_string_utf8(env, args[2], path, 255, &size); // 获取动态库路径信息 
    void *handle = dlopen(path, RTLD_LAZY);                     // 打开一个动态链接库.路径为path 
    dlerror(); 
    FUNC_ADD add_func = (FUNC_ADD)dlsym(handle, "add"); // 获取函数名为add的函数 
    if (dlerror()) { 
        return nullptr; 
    } 
    double res = add_func(value0, value1);              // 调用add并传递参数信息 
    dlclose(handle);                                    // 最后记得close动态库 
    napi_value sum; 
    napi_create_double(env, res, &sum); 
    return sum; 
} 
// ...
分享
微博
QQ
微信
回复
2024-03-19 23:43:56
相关问题
ArkTSNative如何动态加载、卸载so
183浏览 • 1回复 待解决
ArkTSNative如何进行map数据交互
168浏览 • 1回复 待解决
Native如何集成三方SO
151浏览 • 1回复 待解决
如何Native释放ArkTS对象
222浏览 • 1回复 待解决
如何Native构建一个ArkTS对象
181浏览 • 1回复 待解决
Native如何打印char指针
170浏览 • 1回复 待解决
如何Native获取APP版本信息
151浏览 • 1回复 待解决
Native如何获取可操作的文件目录
143浏览 • 1回复 待解决
Native如何使用hilog打印出日志信息
142浏览 • 1回复 待解决
Native如何引入头文件deviceinfo.h
198浏览 • 1回复 待解决
Native创建线程是否有限制
223浏览 • 1回复 待解决
Native工程中如何使用其他三方so
241浏览 • 1回复 待解决