HarmonyOS 鸿蒙Next deveco的openharmony native项目,在c++代码中调用三方so库接口

HarmonyOS 鸿蒙Next deveco的openharmony native项目,在c++代码中调用三方so库接口 通过其它工程生成了一个libexeclib.z.so

想在Deveco的Native代码中调用它的外部接口:

目前的做法是修改了CMakeLists文件:

cmake_minimum_required(VERSION 3.4.1)
project(myohoshap)

set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})

include_directories(${NATIVERENDER_ROOT_PATH}
                    ${NATIVERENDER_ROOT_PATH}/include)
add_library(execlib.z SHARED IMPORTED)
set_target_properties(execlib.z
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/../libs/${ANDROID_ABI}/libexeclib.z.so)
add_library(entry SHARED hello.cpp)

target_link_libraries(entry PUBLIC libace_napi.z.so libhilog_ndk.z.so libc++.a libexeclib.z.so)

然后Native代码中增加了一个exe.h,声明了接口:

extern void start_poc();

然后在hello.cpp中调用该接口:

#include "exe.h"
#define LOG_TAG "myohoshap"

typedef void (*START)(void);
static napi_value Add(napi_env env, napi_callback_info info)
{
    size_t requireArgc = 2;
    size_t argc = 2;
    napi_value args[2] = {nullptr};
    start_poc();
}

但是一直报错,无法找到 -lexeclib.z

ld.lld: error: unable to find library -lexeclib.z

请问有什么方法可以从Native代码中调用SO库的接口


更多关于HarmonyOS 鸿蒙Next deveco的openharmony native项目,在c++代码中调用三方so库接口的实战教程也可以访问 https://www.itying.com/category-93-b0.html

11 回复

更多关于HarmonyOS 鸿蒙Next deveco的openharmony native项目,在c++代码中调用三方so库接口的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这个so是我从openharmony编译的一个lib,想在hap里面调用它的接口。我按上面步骤修改之后,可以编译过去了,但是启动hap之后,整个libentry.so都没办法加载。

大佬 这个问题解决了吗

问题解决了吗

有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html

没有相关内容需要转换。

现在我想在OpenHarmony,DevEco 3.1上调用生成的so库,没有参考的例子,能提供一个吗,谢谢。

把三方库链接进去之后,目前报错(不链接就不报错):

Device info:HUAWEI Mate 40 Pro

Build info:OpenHarmony 3.2.7.5

Module name:com.example.mynativeohoshap

Version:1.0.0

Pid:31261

Uid:20010038

Lifetime: 0.000000s

Js-Engine: ark

page: pages/Index.js

Error message: Cannot read property add of undefined

Stacktrace:

at anonymous (ets\pages\Index.ets:17:43)

//index.ets

import hilog from '@ohos.hilog';
import testNapi from 'libentry.so'

@Entry
@Component
struct Index {
  @State message: string = 'Hello World'

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO);
            hilog.info(0x0000, 'testTag', 'Test NAPI 2 + 3 = %{public}d', testNapi.add(2, 3));
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

大佬,我也遇到这个问题了,请问怎么解决呢,

基本信息

  • 问题描述: 描述问题的具体情况
  • 复制代码:
def example():
    pass
  • 深色代码主题:
def example():
    pass

更新,现在可以编译通过了,但是无法运行。

cmakelist:

add_library(entry SHARED hello.cpp)
add_library(execlib.z SHARED IMPORTED)
set_target_properties(execlib.z PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/../../../libs/arm64-v8a/libexeclib.z.so)
target_link_libraries(entry PUBLIC libace_napi.z.so libhilog_ndk.z.so libc++.a execlib.z)

build-profile.json5

{
  "apiType": 'stageMode',
  "buildOption": {
    "napiLibFilterOption": {
      //按照.so文件的优先级顺序,打包最高优先级的.so文件
//      "pickFirsts": [
//        "**.so"
//      ],
      //按照.so文件的优先级顺序,打包最低优先级的.so 文件
//      "pickLasts": [
//        "**.z.so"
//      ],
      //允许当.so重名冲突时,使用高优先级的.so文件覆盖低优先级的.so文件
      "enableOverride": true
    },
    "externalNativeOptions": {
      "path": "./src/main/cpp/CMakeLists.txt",
      "arguments": "",
      "abiFilters": [
        "arm64-v8a"
      ],
      "cppFlags": ""
    }
  },
  "targets": [
    {
      "name": "default",
      "runtimeOS": "HarmonyOS"
    },
    {
      "name": "ohosTest",
    }
  ]
}

在HarmonyOS(鸿蒙)Next deveco的openharmony native项目中,若你需要在C++代码中调用第三方so库接口,可以按照以下步骤进行:

  1. 确保so库存在:首先,确保你的第三方so库文件已经被正确地放置在了项目的libs目录下,或者系统的某个可访问路径中。

  2. 加载so库:在C++代码中使用dlopen函数来加载so库。例如:

    void* handle = dlopen("path/to/your/library.so", RTLD_LAZY);
    if (!handle) {
        // 处理加载失败的情况
        dlerror();
    }
    
  3. 获取函数指针:使用dlsym函数来获取so库中你想要调用的函数的指针。例如:

    typedef int (*YourFunctionType)(int, int);
    YourFunctionType yourFunction = (YourFunctionType)dlsym(handle, "your_function_name");
    const char* dlsymError = dlerror();
    if (dlsymError) {
        // 处理获取函数指针失败的情况
    }
    
  4. 调用函数:通过获取到的函数指针来调用函数。例如:

    int result = yourFunction(param1, param2);
    
  5. 关闭so库:在不再需要该so库时,使用dlclose函数来关闭它。例如:

    dlclose(handle);
    

如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html

回到顶部