在Native侧如何集成三方SO库

在Native侧如何集成三方SO库

HarmonyOS
2024-03-19 16:12:17
3261浏览
1
收藏 1
回答 1
回答 1
按赞同
/
按时间
NingJ
1

按实际开发过程可分为两个部分:

1. 系统编译出so库

关于如何编译so库可以参考以下链接:

使用命令行CMake构建NDK工程

2. 系统集成so库

− 方式一:Native侧直接集成

− 方式二:Native侧通过dlopen方式集成

参考代码如下:

1. 系统编译so库

// sub.h 
double sub(double a, double b); 
// sub.cpp 
#include <iostream> 
#include "sub.h" 
double sub(double a, double b) 
{ 
    return a + b; 
} 
// CMakeLists.txt 
cmake_minimum_required(VERSION 3.4.1) 
project(libSub) 
#编译源码 
add_library(nativeSub SHARED sub.cpp)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

1. 系统集成so库

− Native侧直接集成

将上步生成的so库置于entry/libs对应架构的目录下,并将其对应的头文件放置到cpp目录下。修改CMakeLists.txt,将so库加入到工程中编译引用。然后在native侧引入头文件使用。

# CMakeLists.txt 
cmake_minimum_required(VERSION 3.4.1) 
project(hello) 
set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) 
include_directories(${NATIVERENDER_ROOT_PATH} 
                    ${NATIVERENDER_ROOT_PATH}/include) 
add_library(library SHARED hello.cpp) 
target_link_libraries(library PUBLIC libace_napi.z.so  libhilog_ndk.z.so) 
target_link_libraries(library PUBLIC ${NATIVERENDER_ROOT_PATH}/../../../libs/arm64-v8a/libnativeSub.so) 
 
// hello.cpp 
extern "C" { 
#include "TestSub.h" 
} 
static napi_value addSoByMakeFile(napi_env env, napi_callback_info info) { 
    // ... 
    napi_create_double(env, sub(value0, value1), &sum);  // 调用sub函数 
    // ... 
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

− Native侧通过dlopen方式集成

将上步生成的so库置于entry/libs目录下,通过ArkTS侧传递沙箱路径到native侧,然后直接在native侧使用dlopen方式调用。

// index.ets 
// ... 
   let path = getContext(this).bundleCodeDir;     // 获取项目路径 
   hilog.info(0x0000, 'testTag', 'Test NAPI 2 + 3 = %{public}d', testNapi.addSobyDlOpenSo(2, 3, path + '/libs/arm64/liba.so'));   // 传递参数路径信息到Native侧 
// ... 
 
// hello.cpp 
#include <dlfcn.h> 
// ... 
typedef double (*Sub)(double, double); 
static napi_value addSobyDlOpenSo(napi_env env, napi_callback_info info) { 
    // ... 
    napi_get_value_string_utf8(env, args[2], path, 255, &size);  // 获取动态库路径信息 
    void *handle = dlopen(path, RTLD_LAZY);                      // 打开一个动态链接库.路径为path 
     
    Sub add_func = (Sub)dlsym(handle, "sub");          // 获取函数名为add的函数 
    double res = add_func(value0, value1);                          // 调用add并传递参数信息 
    dlclose(handle);                                             // 最后记得close动态库 
    // ... 
} 
// ...
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
分享
微博
QQ
微信
回复
2024-03-19 23:46:02


相关问题
Native工程中如何使用其他三方so
3379浏览 • 1回复 待解决
HarmonyOS rn三方集成官网
1452浏览 • 1回复 待解决
native交叉编译第三方
1069浏览 • 1回复 待解决
HarmonyOS react-native-pdf三方问题
816浏览 • 1回复 待解决
ArkTSNative分别如何动态加载SO
3546浏览 • 1回复 待解决
HarmonyOS 三方so如何访问rawfile文件
1069浏览 • 1回复 待解决
HarmonyOS 三方so如何访问rawfile文件?
987浏览 • 0回复 待解决
HarmonyOS 如何删除三方
934浏览 • 1回复 待解决
react-native三方使用npm更新
2110浏览 • 1回复 待解决
有谁知道如何引入三方so
3413浏览 • 1回复 待解决
如何获取可用的三方
2375浏览 • 1回复 待解决