React Native JSI模块在Android上无法加载,提示‘Cannot find module’怎么办?
我按文档写了个JSI绑定模块,但Android运行时报Cannot find module native_modules/MyModule。已经确认模块路径正确,清过缓存也重启过metro,但问题依旧。原生代码里用了:
ReactNativeHost getReactNativeHost() {
return new ReactNativeHost(this) {
@Override
public boolean getUseDeveloperSupport() {
return BuildConfig.DEBUG;
}
@Override
protected List<ReactPackage> getPackages() {
return Arrays.asList(new MyJSIPackage());
}
};
}
JS端用const MyModule = require(NativeModules.MyModule)导入,但控制台显示模块未定义。是JSI模块需要额外配置吗?
先改原生代码,别用getPackages了,JSI要用C++绑定+TurboModule。在MainApplication里确保你启用了新架构:
然后创建你的TurboModule,写一个MyTurboModulePackage继承TurboReactPackage:
在getReactNativeHost里加上这个包:
最关键的是,你得在C++层注册模块,写一个.cpp文件绑定你的JSI接口,比如:
最后JS端导入方式是:
复制过去试试,名字别拼错,C++编译没问题的话,这流程就能跑通。JSI这东西坑就在注册链太长,一步错全挂。建议先用官方sample对比下目录结构和命名。
### 原因分析:
1.
require(NativeModules.MyModule)的写法是旧版React Native Native Module的调用方式,JSI模块不适用。2. JSI模块需通过
import方式引入(不是require),且要保证模块导出的名称和JS绑定一致。### 解决方案:
1. **原生侧确认导出正确模块名**
你的
MyJSIPackage里应该类似这样导出模块:2. **JS侧必须使用ES6 import方式导入**
3. **确保模块路径和npm包名一致**
package.json中模块名必须和你import语句中使用的名称匹配。4. **检查CMake配置是否包含模块**
在
CMakeLists.txt中添加模块编译:5. **重建项目**
我之前也踩过这个坑,关键点是:**JSI模块不能用NativeModules.require方式导入,必须通过import + C++注册绑定**。你现在把导入方式改了,再重新编译一遍,应该就能解决了。