在Native侧如何集成三方SO库?

在Native侧如何集成三方SO库

阅读 4.2k
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)

2.系统集成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动态库 
    // ... 
} 
// ...
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进