改造DevEco Studio默认生成的Native C++项目,调用第三方so时崩溃
改造DevEco Studio默认生成的Native C++项目,调用第三方so时崩溃 我用的是DevEco Studio 5.0.4 Release,先创建了一个native C++的项目,然后将我按照《使用命令行CMake构建NDK工程》编译得到的libsum.so按照下图所示的方式加入了项目。
然后,在原有的CMakeLists.txt中增加了sum,试图链接libsum.so
# the minimum version of CMake.
cmake_minimum_required(VERSION 3.5.0)
project(sumTest2)
set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})
if(DEFINED PACKAGE_FIND_FILE)
include(${PACKAGE_FIND_FILE})
endif()
include_directories(${NATIVERENDER_ROOT_PATH}
${NATIVERENDER_ROOT_PATH}/include)
add_library(entry SHARED napi_init.cpp)
# 添加库搜索路径(替代硬编码绝对路径)
target_link_directories(entry PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/libs/${OHOS_ARCH}
)
target_link_libraries(entry PUBLIC libace_napi.z.so sum)
其他也没有做什么操作,甚至都没有在napi_init.cpp里面增加对libsum.so中的函数的调用(增加之后也是崩溃,为了简化问题定位就没加),启动后点击“Hello World”就崩溃了。
崩溃信息:
Open absolute_path library: check ns accessible failed, pathname /system/lib64/libstylus_innerapi.z.so namespace ndk.
Error loading header /system/lib64/libstylus_innerapi.z.so, namespace ndk has no inherits, errno=2
Error loading header: can't find library /system/lib64/libstylus_innerapi.z.so in namespace: default
dlopen_impl load library header failed for /system/lib64/libstylus_innerapi.z.so
可我的libsum.so里面也没调用这个**/system/lib64/libstylus_innerapi.z.so**库啊。
napi_init.cpp的内容没有动:
#include "napi/native_api.h"
static napi_value Add(napi_env env, napi_callback_info info)
{
size_t argc = 2;
napi_value args[2] = {nullptr};
napi_get_cb_info(env, info, &argc, args , nullptr, nullptr);
napi_valuetype valuetype0;
napi_typeof(env, args[0], &valuetype0);
napi_valuetype valuetype1;
napi_typeof(env, args[1], &valuetype1);
double value0;
napi_get_value_double(env, args[0], &value0);
double value1;
napi_get_value_double(env, args[1], &value1);
napi_value sum;
napi_create_double(env, value0 + value1, &sum);
return sum;
}
EXTERN_C_START
static napi_value Init(napi_env env, napi_value exports)
{
napi_property_descriptor desc[] = {
{"add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr}
};
napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
return exports;
}
EXTERN_C_END
static napi_module demoModule = {
.nm_version = 1,
.nm_flags = 0,
.nm_filename = nullptr,
.nm_register_func = Init,
.nm_modname = "entry",
.nm_priv = ((void*)0),
.reserved = { 0 },
};
extern "C" __attribute__((constructor)) void RegisterEntryModule(void)
{
napi_module_register(&demoModule);
}
index.ets的代码也没有动:
import { hilog } from '@kit.PerformanceAnalysisKit';
import testNapi from 'libentry.so';
const DOMAIN = 0x0000;
@Entry
@Component
struct Index {
@State message: string = 'Hello World';
build() {
Row() {
Column() {
Text(this.message)
.fontSize($r('app.float.page_text_font_size'))
.fontWeight(FontWeight.Bold)
.onClick(() => {
this.message = 'Welcome';
hilog.info(DOMAIN, 'testTag', 'Test NAPI 2 + 3 = %{public}d', testNapi.add(2, 3));
})
}
.width('100%')
}
.height('100%')
}
}
entry\src\main\module.json5的内容也没有动:
{
"module": {
"name": "entry",
"type": "entry",
"description": "$string:module_desc",
"mainElement": "EntryAbility",
"deviceTypes": [
"phone",
"tablet",
"2in1"
],
"deliveryWithInstall": true,
"installationFree": false,
"pages": "$profile:main_pages",
"abilities": [
{
"name": "EntryAbility",
"srcEntry": "./ets/entryability/EntryAbility.ets",
"description": "$string:EntryAbility_desc",
"icon": "$media:layered_image",
"label": "$string:EntryAbility_label",
"startWindowIcon": "$media:startIcon",
"startWindowBackground": "$color:start_window_background",
"exported": true,
"skills": [
{
"entities": [
"entity.system.home"
],
"actions": [
"action.system.home"
]
}
]
}
],
"extensionAbilities": [
{
"name": "EntryBackupAbility",
"srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets",
"type": "backup",
"exported": false,
"metadata": [
{
"name": "ohos.extension.backup",
"resource": "$profile:backup_config"
}
],
}
]
}
}
手机型号:
在鸿蒙Native C++项目中调用第三方so崩溃,常见原因及解决方法如下:
-
ABI兼容问题:确保第三方so的ABI架构(armeabi-v7a/arm64-v8a)与项目匹配。检查build.gradle中abiFilters设置。
-
符号表缺失:使用nm工具检查so是否包含所需函数符号。确认NDK版本兼容。
-
加载顺序错误:在CMakeLists.txt中正确设置target_link_libraries顺序。
-
权限问题:确认so文件权限设置为755,并部署到正确目录(/libs/对应ABI/)。
-
依赖缺失:使用readelf -d查看so的依赖库是否全部满足。
可通过adb logcat查看具体崩溃堆栈,定位问题根源。
从错误信息来看,问题出在系统尝试加载/system/lib64/libstylus_innerapi.z.so
时失败,而这个库并不是你直接引用的。这种情况通常有以下几种可能原因:
-
你的libsum.so可能隐式依赖了libstylus_innerapi.z.so,可以通过
readelf -d libsum.so
检查依赖关系 -
可能是NDK版本兼容性问题,建议检查:
- 确保libsum.so使用的NDK版本与DevEco Studio项目配置的NDK版本一致
- 尝试在CMakeLists.txt中明确指定NDK版本
- 命名空间访问问题,可以尝试在CMakeLists.txt中添加:
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--allow-shlib-undefined")
- 也可能是HarmonyOS的沙箱安全限制,建议:
- 将so文件放在
src/main/resources/rawfile
目录下 - 在module.json5中添加对应的nativeLibrary配置
建议先检查libsum.so的依赖关系,确认是否有隐式依赖导致的问题。