按实际开发过程可分为两个部分: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动态库 // ... } // ...
按实际开发过程可分为两个部分:
1.系统编译出so库
关于如何编译so库可以参考以下链接:使用命令行CMake构建NDK工程
2.系统集成so库
− 方式一:Native侧直接集成
− 方式二:Native侧通过dlopen方式集成
参考代码如下:
1.系统编译so库
2.系统集成so库
Native侧直接集成
将上步生成的so库置于entry/libs对应架构的目录下,并将其对应的头文件放置到cpp目录下。修改CMakeLists.txt,将so库加入到工程中编译引用。然后在native侧引入头文件使用。
Native侧通过dlopen方式集成
将上步生成的so库置于entry/libs目录下,通过ArkTS侧传递沙箱路径到native侧,然后直接在native侧使用dlopen方式调用。