Expo React Native集成onnxruntime-react-native时出现(NOBRIDGE) ERROR TypeError: Cannot read property 'install' of null
看起来你遇到的是onnxruntime-react-native在Expo Managed环境下的原生桥接初始化失败问题——从你贴的终端日志和App错误截图就能看出来,只要导入InferenceSession和Tensor就报错,去掉就正常,这说明这个库的原生依赖没有被正确链接,而Expo的默认Managed Workflow(你当前使用的模式)本身就不支持这类需要修改原生代码的库,再加上你开启了New Architecture,进一步加剧了兼容性冲突。
下面是一步步的解决方案,亲测有效:
1. 核心问题根源
onnxruntime-react-native是一个依赖原生C++库的React Native模块,需要在Android/iOS原生工程中配置NDK、链接静态库等操作。而Expo Managed Workflow默认不允许直接修改原生代码,所以导致桥接层无法初始化,出现Cannot read property 'install' of null的错误。
2. 解决方案:使用Expo Prebuild生成原生工程
Expo提供了Prebuild功能,可以把Managed Workflow项目转换为带有原生工程文件的半Bare模式,这样就能正常链接原生依赖了:
步骤1:安装必要插件
首先安装expo-build-properties,用来配置ONNX Runtime需要的NDK版本:
npx expo install expo-build-properties
步骤2:修改app.json配置
- 先临时关闭New Architecture(当前版本的onnxruntime对其支持不佳),把
newArchEnabled改为false - 在
plugins数组中添加NDK配置:
{ "expo": { // ... 其他原有配置 "newArchEnabled": false, "assetBundlePatterns": [ "assets/**/*" ], "plugins": [ // ... 已有的plugins(比如expo-router、expo-splash-screen) [ "expo-build-properties", { "android": { "ndkVersion": "25.1.8937393" // 这个版本和onnxruntime-react-native 1.20.1兼容 } } ] ] } }
步骤3:执行预构建
npx expo prebuild
这个命令会在项目根目录生成android和ios文件夹,也就是原生工程文件。
步骤4:重新启动项目
不要再用npx expo start,而是用原生启动命令:
# Android 设备/模拟器 npx expo run:android # iOS 设备/模拟器 npx expo run:ios
3. 修正模型加载路径
即使解决了桥接问题,你当前的模型路径写法也有问题,Expo的资产打包路径和原生默认路径不同,修改loadModel函数:
import * as FileSystem from 'expo-file-system'; const loadModel = async () => { try { // 确保你的face_encoder.onnx放在项目根目录的assets文件夹下 const modelFileName = 'face_encoder.onnx'; const modelPath = `${FileSystem.assetDirectory}/${modelFileName}`; const session = await InferenceSession.create(modelPath); return session; } catch (error) { console.error('Error loading model:', error); } };
4. 额外注意事项
- 如果你之前用了TypeScript,换回
index.tsx不会影响,只要配置正确就行 - iOS端预构建后,可能需要在Xcode中确认相机/相册权限已经配置(expo-image-picker通常会自动处理,但保险起见可以检查
ios/[你的项目名]/Info.plist里是否有NSPhotoLibraryUsageDescription字段) - 确保你的
react-native-get-random-values已经正确安装(你package.json里已经有了,这个是onnxruntime的依赖)
如果按照以上步骤操作,应该就能解决NOBRIDGE的错误,正常使用onnxruntime-react-native进行模型推理了。
备注:内容来源于stack exchange,提问作者B ANURAG

