--- name: native-modules description: Expert in React Native native modules, bridging JavaScript and native code, writing custom native modules, using Turbo Modules, Fabric, JSI, autolinking, module configuration, iOS Swift/Objective-C modules, Android Kotlin/Java modules. Activates for native module, native code, bridge, turbo module, JSI, fabric, autolinking, custom native module, ios module, android module, swift, kotlin, objective-c, java native code. --- # Native Modules Expert Specialized in React Native native module integration, including custom native module development, third-party native library integration, and troubleshooting native code issues. ## What I Know ### Native Module Fundamentals **What Are Native Modules?** - Bridge between JavaScript and native platform code - Access platform-specific APIs (Bluetooth, NFC, etc.) - Performance-critical operations - Integration with existing native SDKs **Modern Architecture** - **Old Architecture**: Bridge-based (React Native < 0.68) - **New Architecture** (React Native 0.68+): - **JSI** (JavaScript Interface): Direct JS ↔ Native communication - **Turbo Modules**: Lazy-loaded native modules - **Fabric**: New rendering engine ### Using Third-Party Native Modules **Installation with Autolinking** ```bash # Install module npm install react-native-camera # iOS: Install pods (autolinking handles most configuration) cd ios && pod install && cd .. # Rebuild the app npm run ios npm run android ``` **Manual Linking (Legacy)** ```bash # React Native < 0.60 (rarely needed now) react-native link react-native-camera ``` **Expo Integration** ```bash # For Expo managed workflow, use config plugins npx expo install react-native-camera # Add plugin to app.json { "expo": { "plugins": [ [ "react-native-camera", { "cameraPermission": "Allow $(PRODUCT_NAME) to access your camera" } ] ] } } # Rebuild dev client eas build --profile development --platform all ``` ### Creating Custom Native Modules **iOS Native Module (Swift)** ```swift // RCTCalendarModule.swift import Foundation @objc(CalendarModule) class CalendarModule: NSObject { @objc static func requiresMainQueueSetup() -> Bool { return false } @objc func createEvent(_ name: String, location: String, date: NSNumber) { // Native implementation print("Creating event: \(name) at \(location)") } @objc func getEvents(_ callback: @escaping RCTResponseSenderBlock) { let events = ["Event 1", "Event 2", "Event 3"] callback([NSNull(), events]) } @objc func findEvents(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) { // Async with Promise DispatchQueue.global().async { let events = self.fetchEventsFromNativeAPI() resolve(events) } } } ``` ```objectivec // RCTCalendarModule.m (Bridge file) #import @interface RCT_EXTERN_MODULE(CalendarModule, NSObject) RCT_EXTERN_METHOD(createEvent:(NSString *)name location:(NSString *)location date:(nonnull NSNumber *)date) RCT_EXTERN_METHOD(getEvents:(RCTResponseSenderBlock)callback) RCT_EXTERN_METHOD(findEvents:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) @end ``` **Android Native Module (Kotlin)** ```kotlin // CalendarModule.kt package com.myapp import com.facebook.react.bridge.* class CalendarModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) { override fun getName(): String { return "CalendarModule" } @ReactMethod fun createEvent(name: String, location: String, date: Double) { // Native implementation println("Creating event: $name at $location") } @ReactMethod fun getEvents(callback: Callback) { val events = WritableNativeArray().apply { pushString("Event 1") pushString("Event 2") pushString("Event 3") } callback.invoke(null, events) } @ReactMethod fun findEvents(promise: Promise) { try { val events = fetchEventsFromNativeAPI() promise.resolve(events) } catch (e: Exception) { promise.reject("ERROR", e.message, e) } } } ``` ```kotlin // CalendarPackage.kt package com.myapp import com.facebook.react.ReactPackage import com.facebook.react.bridge.NativeModule import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.uimanager.ViewManager class CalendarPackage : ReactPackage { override fun createNativeModules(reactContext: ReactApplicationContext): List { return listOf(CalendarModule(reactContext)) } override fun createViewManagers(reactContext: ReactApplicationContext): List> { return emptyList() } } ``` **JavaScript Usage** ```javascript // CalendarModule.js import { NativeModules } from 'react-native'; const { CalendarModule } = NativeModules; export default { createEvent: (name, location, date) => { CalendarModule.createEvent(name, location, date); }, getEvents: (callback) => { CalendarModule.getEvents((error, events) => { if (error) { console.error(error); } else { callback(events); } }); }, findEvents: async () => { try { const events = await CalendarModule.findEvents(); return events; } catch (error) { console.error(error); throw error; } } }; // Usage in components import CalendarModule from './CalendarModule'; function MyComponent() { const handleCreateEvent = () => { CalendarModule.createEvent('Meeting', 'Office', Date.now()); }; const handleGetEvents = async () => { const events = await CalendarModule.findEvents(); console.log('Events:', events); }; return (