HarmonyOS鸿蒙Next中NativeModule调用报错?模块加载失败,Error message: is not callable

HarmonyOS鸿蒙Next中NativeModule调用报错?模块加载失败,Error message: is not callable

我有一个组件,这个组件会编出libxxx.so。通过napi定义了native module,

static napi_module demoModule = {
    .nm_version =1,
    .nm_flags = 0,
    .nm_filename = nullptr,
    .nm_register_func = Init,
    .nm_modname = "xxx",
    .nm_priv = ((void*)0),
    .reserved = { 0 },
};

extern "C" __attribute__((constructor)) void RegisterEntryModule(void)
{
    napi_module_register(&demoModule);
}

但是在部分项目中,调用so的api就会出现

Error name: TypeError

Error message: is not callable

请问要怎么解决。

相关词:napi模块加载失败,is not callableis not callable


更多关于HarmonyOS鸿蒙Next中NativeModule调用报错?模块加载失败,Error message: is not callable的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

你可以按照下面这两个wiki进行排查:

Node-API常见问题-使用Node-API实现跨语言交互-代码开发-NDK开发 - 华为HarmonyOS开发者

Node-API开发规范-使用Node-API实现跨语言交互-代码开发-NDK开发 - 华为HarmonyOS开发者

如果经过上面排查还是没排查出来原因,也可以看看你的libxxx.so是不是之前已经被dlopen过了,如果被dlopen过,也有可能就会导致is not callable这种问题。对于这种场景,把第一次需要dlopen的能力单独封装出来一个libsub.so然后用libxxx.so依赖libsub.so,这样相当于做了个隔离。libsub.so这里面不要有napi_module_register逻辑,等后面你真正想导入libxxx.so的时候,在导入libxxx.so

同时,你也可以看看动态加载能力是否可以满足你的场景

使用Node-API接口进行模块加载-Node-API典型使用场景-使用Node-API实现跨语言交互-代码开发-NDK开发 - 华为HarmonyOS开发者

使用Node-API接口在主线程中进行模块加载-Node-API典型使用场景-使用Node-API实现跨语言交互-代码开发-NDK开发 - 华为HarmonyOS开发者

更多关于HarmonyOS鸿蒙Next中NativeModule调用报错?模块加载失败,Error message: is not callable的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,NativeModule调用报错“模块加载失败,Error message: is not callable”通常是由于模块未正确导出或调用方式错误。确保模块在oh-package.json5中正确声明,并在代码中使用importrequire正确导入。检查模块的导出方式,确保导出的函数或对象是可调用的。

这个问题通常是由于Native模块注册或导出函数时出现问题导致的。以下是几个关键检查点:

  1. 确保Init函数中正确导出了所有API方法:
napi_value Init(napi_env env, napi_value exports) {
    napi_property_descriptor desc[] = {
        DECLARE_NAPI_FUNCTION("yourMethod", YourMethodImpl),
        // 其他方法...
    };
    napi_define_properties(env, exports, sizeof(desc)/sizeof(desc[0]), desc);
    return exports;
}
  1. 检查模块名称一致性:
  • nm_modname(“xxx”)必须与JS侧import的名称完全匹配
  • 确保.so文件名与模块名对应
  1. 常见问题排查:
  • 检查Init函数是否返回了exports对象
  • 确认所有NAPI方法都使用了正确的napi_function签名
  • 验证.so文件是否被正确打包到应用中

建议先检查这些基本配置点,如果问题仍然存在,可以提供更详细的错误日志和调用代码片段以便进一步分析。

回到顶部