React Native JSI模块在Android上无法加载,提示‘Cannot find module’怎么办?

IT人统乐 阅读 115

我按文档写了个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模块需要额外配置吗?

我来解答 赞 6 收藏
二维码
手机扫码查看
2 条解答
小金静
小金静 Lv1
JSI模块不能用传统的ReactPackage方式注册,你现在这套是给老式Native Module用的,JSI得走新架构那一套。你现在的require写法也不对,NativeModules.MyModule是自动注入的,你不能直接require路径。

先改原生代码,别用getPackages了,JSI要用C++绑定+TurboModule。在MainApplication里确保你启用了新架构:

protected boolean getUseDeveloperSupport() {
return BuildConfig.DEBUG;
}

@Override
protected String getJSMainModuleName() {
return "index";
}
// 别写getPackages,让MainApplication实现ReactApplication就行


然后创建你的TurboModule,写一个MyTurboModulePackage继承TurboReactPackage:

public class MyTurboModulePackage extends TurboReactPackage implements ReactPackage {
}


在getReactNativeHost里加上这个包:

protected List<ReactPackage> getPackages() {
return Arrays.asList(
new MyTurboModulePackage()
);
}


最关键的是,你得在C++层注册模块,写一个.cpp文件绑定你的JSI接口,比如:

// MyModule.cpp
static jsi::Value myFunction(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value *args, size_t count) {
// 实现逻辑
}

void MyModule::initialize() {
exportedMethods_ = {
{"myFunction", MethodMetadata {0, myFunction}}
};
}


最后JS端导入方式是:

import {TurboModuleRegistry} from 'react-native';

const MyModule = TurboModuleRegistry.get('MyModule'); // 注意名字要和C++里注册的一致

if (!MyModule) {
throw new Error('MyModule not loaded');
}


复制过去试试,名字别拼错,C++编译没问题的话,这流程就能跑通。JSI这东西坑就在注册链太长,一步错全挂。建议先用官方sample对比下目录结构和命名。
点赞 3
2026-02-12 11:09
码农颖杰
Android上JSI模块加载失败,核心原因有两个:模块注册路径不匹配或JS端导入方式错误。

### 原因分析:
1. require(NativeModules.MyModule)的写法是旧版React Native Native Module的调用方式,JSI模块不适用。
2. JSI模块需通过import方式引入(不是require),且要保证模块导出的名称和JS绑定一致。

### 解决方案:
1. **原生侧确认导出正确模块名**
你的MyJSIPackage里应该类似这样导出模块:
class JSIMyModuleSpec : public JSIMyModuleSpecCxx {
public:
JSIMyModuleSpec(std::shared_ptr<CallInvoker> jsInvoker)
: JSIMyModuleSpecCxx(jsInvoker) {}

void install(jsi::Runtime &rt) override {
rt.global().setProperty(
rt, "MyModule",
jsi::Object::createFromHostObject(rt, std::make_shared<MyModule>(jsInvoker_)));
}
};


2. **JS侧必须使用ES6 import方式导入**
import {MyModule} from 'react-native';


3. **确保模块路径和npm包名一致**
package.json中模块名必须和你import语句中使用的名称匹配。

4. **检查CMake配置是否包含模块**
CMakeLists.txt中添加模块编译:
add_library(my_module SHARED src/cpp/MyModule.cpp)
target_link_libraries(my_module PRIVATE react_native_jsc)


5. **重建项目**
cd android
./gradlew clean
cd ..
npx react-native run-android


我之前也踩过这个坑,关键点是:**JSI模块不能用NativeModules.require方式导入,必须通过import + C++注册绑定**。你现在把导入方式改了,再重新编译一遍,应该就能解决了。
点赞 5
2026-02-04 14:18