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
您先看一下这个文档:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/creating_har_api8-0000001341502357
更多关于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)
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库接口,可以按照以下步骤进行:
-
确保so库存在:首先,确保你的第三方so库文件已经被正确地放置在了项目的libs目录下,或者系统的某个可访问路径中。
-
加载so库:在C++代码中使用
dlopen
函数来加载so库。例如:void* handle = dlopen("path/to/your/library.so", RTLD_LAZY); if (!handle) { // 处理加载失败的情况 dlerror(); }
-
获取函数指针:使用
dlsym
函数来获取so库中你想要调用的函数的指针。例如:typedef int (*YourFunctionType)(int, int); YourFunctionType yourFunction = (YourFunctionType)dlsym(handle, "your_function_name"); const char* dlsymError = dlerror(); if (dlsymError) { // 处理获取函数指针失败的情况 }
-
调用函数:通过获取到的函数指针来调用函数。例如:
int result = yourFunction(param1, param2);
-
关闭so库:在不再需要该so库时,使用
dlclose
函数来关闭它。例如:dlclose(handle);
如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html,