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
你可以按照下面这两个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
中正确声明,并在代码中使用import
或require
正确导入。检查模块的导出方式,确保导出的函数或对象是可调用的。
这个问题通常是由于Native模块注册或导出函数时出现问题导致的。以下是几个关键检查点:
- 确保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;
}
- 检查模块名称一致性:
- nm_modname(“xxx”)必须与JS侧import的名称完全匹配
- 确保.so文件名与模块名对应
- 常见问题排查:
- 检查Init函数是否返回了exports对象
- 确认所有NAPI方法都使用了正确的napi_function签名
- 验证.so文件是否被正确打包到应用中
建议先检查这些基本配置点,如果问题仍然存在,可以提供更详细的错误日志和调用代码片段以便进一步分析。