多模块之间,若有 SO 的依赖,需要如何依赖组织?

多模块之间,若有 SO 的依赖,需要如何依赖组织?

HarmonyOS
2天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
Heiang

​在处理多模块之间的SO依赖时,可以通过将隐式依赖转为显式依赖来进行解耦。具体做法是,利用dlopen和dlsym接口进行SO的编译依赖解耦。修改代码和CMakeLists.txt文件,并利用Native侧的dlopen方法编译出相应的library.生成的.so文件会在build/default/intermediates/cmake/default/obj目录下,然后将这些文件移动到libs目录下。最后,修改CMakeLists.txt文件以引入这些新的.so文件供项目编译使用。

可以参考下述demo:创建HAR模块。

1、添加减法接口sub​。

//  library\src\main\cpp\hello.cpp 
static napi_value Sub(napi_env env, napi_callback_info info) { 
  size_t requireArgc = 2; 
  size_t argc = 2; 
  napi_value args[2] = {nullptr}; 
 
  napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 
 
  napi_valuetype valuetype0; 
  napi_typeof(env, args[0], &valuetype0); 
 
  napi_valuetype valuetype1; 
  napi_typeof(env, args[1], &valuetype1); 
 
  double value0; 
  napi_get_value_double(env, args[0], &value0); 
 
  double value1; 
  napi_get_value_double(env, args[1], &value1); 
 
  napi_value sum; 
  napi_create_double(env, value0 - value1, &sum); 
 
  return sum; 
} 
 
//  library\src\main\cpp\hello.cpp 
EXTERN_C_START 
static napi_value Init(napi_env env, napi_value exports) 
{ 
  napi_property_descriptor desc[] = { 
  {"add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr}, 
{"sub", nullptr, Sub, nullptr, nullptr, nullptr, napi_default, nullptr} 
}; 
napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); 
return exports; 
} 
EXTERN_C_END

2、以导出liblibrary.so的加减法接口add和sub为例。

// library/src/main/ets/utils/nativeTest.ts 
import native from 'liblibrary.so' 
 
export function nativeAdd(a: number, b: number) { 
  let result: number = native.add(a, b); 
  return result; 
} 
 
export function nativeSub(a: number, b: number) { 
  let result: number = native.sub(a, b); 
  return result; 
}

3、HAR对外暴露的接口,在Index.ets导出文件中声明如下所示:

// library/Index.ets  
export { nativeAdd, nativeSub } from './src/main/ets/utils/nativeTest'

​4、引用本地HAR包,有如下两种方式:

方式一:在Terminal窗口中,执行如下命令进行安装,并会在oh-package.json5中自动添加依赖。

ohpm install ./library/build/default/outputs/default/library.har

方式二:在工程的oh-package.json5中设置三方包依赖,配置示例如下:​

"dependencies": {
"library": "file:../library/build/default/outputs/default/library.har"
}

依赖设置完成后,需要执行ohpm install命令安装依赖包,依赖包会存储在工程的oh_modules目录下。

ohpm install

5、通过import引用HAR导出的native方法,示例如下所示:

// entry/src/main/ets/pages/Index.ets 
import { nativeAdd, nativeSub } from 'library' 
 
@Entry 
@Component 
struct Index { 
 
  build() { 
    Row() { 
      Column() { 
        Button('ArkTS call C++') 
          .fontSize(50) 
          .fontWeight(FontWeight.Bold) 
          .onClick(() => { 
            hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); 
            hilog.info(0x0000, 'testTag', 'Test NAPI 2 + 3 = %{public}d', nativeAdd(2, 3)); 
            hilog.info(0x0000, 'testTag', 'Test NAPI 2 - 3 = %{public}d', nativeSub(2, 3)); 
          }) 
      } 
      .width('100%') 
    } 
    .height('100%') 
  } 
}
分享
微博
QQ
微信
回复
2天前
相关问题
so相互依赖场景下如何解耦
1918浏览 • 1回复 待解决
模块依赖冲突/依赖仲裁方法?
1186浏览 • 1回复 待解决
Native Module之间依赖如何配置
880浏览 • 1回复 待解决
模块之间数据互相访问
138浏览 • 1回复 待解决
如何处理HAR之间互相依赖
2244浏览 • 1回复 待解决
HarmonyOS 工程能否依赖外部模块源码
304浏览 • 1回复 待解决
HarmonyOS har依赖so库有冲突是如何解决
257浏览 • 1回复 待解决
HarmonyOS module同时依赖同一个har
534浏览 • 1回复 待解决