You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Expo Modules是否支持复用Java与Objective-C原生代码?

Expo Modules 复用Java/Objective-C原生代码的实现方案

Expo Modules完全支持Java和Objective-C,官方文档侧重Kotlin/Swift只是因为它们是安卓、iOS生态的现代推荐语言,并非禁用旧语言。以下是具体实现方法:

安卓端(Java)

  1. 创建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模块的原生数据");
    }
}
  1. 注册模块:找到安卓项目中的ExpoModulesProvider.java,将你的Java模块加入模块列表:
@Override
public List<Class<? extends ExpoModule>> getModulesList() {
    return Arrays.asList(
        // ...其他模块
        MyJavaModule.class
    );
}
  1. JS端调用:和调用Kotlin模块一致,通过expo-modules-core获取模块并调用方法:
import { NativeModules } from 'react-native';
const { MyJavaModule } = NativeModules;

// 调用异步方法
MyJavaModule.getNativeData().then(data => console.log(data));

iOS端(Objective-C)

  1. 创建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
  1. 注册模块:找到iOS项目中的ExpoModulesProvider.m,将模块加入返回的数组:
- (NSArray<id<EXExpoModuleProtocol>> *)modulesToExport {
    return @[
        // ...其他模块
        [[MyObjCModule alloc] init]
    ];
}
  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 15:22:46