改造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"
          }
        ],
      }
    ]
  }
}

手机型号:


2 回复

在鸿蒙Native C++项目中调用第三方so崩溃,常见原因及解决方法如下:

  1. ABI兼容问题:确保第三方so的ABI架构(armeabi-v7a/arm64-v8a)与项目匹配。检查build.gradle中abiFilters设置。

  2. 符号表缺失:使用nm工具检查so是否包含所需函数符号。确认NDK版本兼容。

  3. 加载顺序错误:在CMakeLists.txt中正确设置target_link_libraries顺序。

  4. 权限问题:确认so文件权限设置为755,并部署到正确目录(/libs/对应ABI/)。

  5. 依赖缺失:使用readelf -d查看so的依赖库是否全部满足。

可通过adb logcat查看具体崩溃堆栈,定位问题根源。


从错误信息来看,问题出在系统尝试加载/system/lib64/libstylus_innerapi.z.so时失败,而这个库并不是你直接引用的。这种情况通常有以下几种可能原因:

  1. 你的libsum.so可能隐式依赖了libstylus_innerapi.z.so,可以通过readelf -d libsum.so检查依赖关系

  2. 可能是NDK版本兼容性问题,建议检查:

  • 确保libsum.so使用的NDK版本与DevEco Studio项目配置的NDK版本一致
  • 尝试在CMakeLists.txt中明确指定NDK版本
  1. 命名空间访问问题,可以尝试在CMakeLists.txt中添加:
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--allow-shlib-undefined")
  1. 也可能是HarmonyOS的沙箱安全限制,建议:
  • 将so文件放在src/main/resources/rawfile目录下
  • 在module.json5中添加对应的nativeLibrary配置

建议先检查libsum.so的依赖关系,确认是否有隐式依赖导致的问题。

回到顶部