在Native侧如何集成三方SO库

在Native侧如何集成三方SO库

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

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

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. 系统集成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函数 
    // ... 
}

− 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动态库 
    // ... 
} 
// ...
分享
微博
QQ
微信
回复
2024-03-19 23:46:02
相关问题
Native工程中如何使用其他三方so
279浏览 • 1回复 待解决
有谁知道如何引入三方so
509浏览 • 1回复 待解决
如何获取可用的三方
210浏览 • 1回复 待解决
求大佬告知如何使用三方cpp
193浏览 • 1回复 待解决
三方js迁移有懂的吗?
324浏览 • 1回复 待解决
三方应用如何获取http代理信息
165浏览 • 1回复 待解决
HarmonyOS如何移植第三方MCU?
7108浏览 • 1回复 待解决
开发第三方SDK如何编译?
11668浏览 • 2回复 待解决
三方应用如何获取蓝牙mac地址
356浏览 • 1回复 待解决
ArkTS不支持使用第三方的js
1654浏览 • 1回复 待解决