Expo Modules是否支持复用Java与Objective-C原生代码?
Expo Modules 复用Java/Objective-C原生代码的实现方案
Expo Modules完全支持Java和Objective-C,官方文档侧重Kotlin/Swift只是因为它们是安卓、iOS生态的现代推荐语言,并非禁用旧语言。以下是具体实现方法:
安卓端(Java)
- 创建Java模块类:在Expo模块的安卓源码目录(通常是
android/src/main/java/[包名]/)下新建Java类,实现ExpoModule及相关接口:
import expo.modules.core.interfaces.ExpoModule; import expo.modules.core.interfaces.ExportedModule; import expo.modules.core.interfaces.Promise; import expo.modules.core.interfaces.ModuleRegistryConsumer; import expo.modules.core.ModuleRegistry; public class MyJavaModule implements ExpoModule, ExportedModule, ModuleRegistryConsumer { private ModuleRegistry mModuleRegistry; @Override public String getName() { return "MyJavaModule"; // JS端调用时的模块名 } @Override public void setModuleRegistry(ModuleRegistry moduleRegistry) { mModuleRegistry = moduleRegistry; // 处理模块依赖 } // 导出给JS的异步方法 public void getNativeData(Promise promise) { // 这里可以直接调用你已有的Java原生代码逻辑 promise.resolve("来自Java模块的原生数据"); } }
- 注册模块:找到安卓项目中的
ExpoModulesProvider.java,将你的Java模块加入模块列表:
@Override public List<Class<? extends ExpoModule>> getModulesList() { return Arrays.asList( // ...其他模块 MyJavaModule.class ); }
- JS端调用:和调用Kotlin模块一致,通过
expo-modules-core获取模块并调用方法:
import { NativeModules } from 'react-native'; const { MyJavaModule } = NativeModules; // 调用异步方法 MyJavaModule.getNativeData().then(data => console.log(data));
iOS端(Objective-C)
- 创建Objective-C模块:在Expo模块的iOS源码目录下新建头文件和实现文件:
MyObjCModule.h:
#import <ExpoModulesCore/ExpoModulesCore.h> @interface MyObjCModule : NSObject <EXExpoModuleProtocol> @end
MyObjCModule.m:
#import "MyObjCModule.h" @implementation MyObjCModule // 注册模块,指定JS端可见的模块名 EX_EXPORT_MODULE(MyObjCModule); // 导出给JS的异步方法 EX_EXPORT_METHOD_AS(getNativeData, resolver:(EXPromiseResolveBlock)resolve rejecter:(EXPromiseRejectBlock)reject) { // 直接复用你已有的Objective-C原生代码逻辑 resolve(@"来自Objective-C模块的原生数据"); } @end
- 注册模块:找到iOS项目中的
ExpoModulesProvider.m,将模块加入返回的数组:
- (NSArray<id<EXExpoModuleProtocol>> *)modulesToExport { return @[ // ...其他模块 [[MyObjCModule alloc] init] ]; }
- JS端调用:与Swift模块调用方式完全相同:
import { NativeModules } from 'react-native'; const { MyObjCModule } = NativeModules; MyObjCModule.getNativeData().then(data => console.log(data));
额外注意事项
- 如果是复用已有的独立Java/Objective-C原生库,只需将库作为依赖引入到Expo模块项目中,再在上述模块类中调用库的API即可。
- 虽然官方支持旧语言,但后续扩展功能时,建议逐步迁移到Kotlin/Swift——官方的新特性、API会优先适配现代语言,长期维护成本更低。
- 确保你的原生代码符合Expo模块的生命周期规范,比如正确处理模块注册、依赖注入逻辑。
内容的提问来源于stack exchange,提问作者Jack Greenlee
相关产品推荐
相关产品推荐

