Subroutine Logo
Subroutine
← Back to Articles Languages Intermediate 6 min read

Native vs Hybrid Mobile Frameworks: Swift/Kotlin vs React Native & Flutter

An interactive deep-dive into mobile runtime environments, JSI thread marshalling, Skia/Impeller C++ rendering, and performance trade-offs.

Published: 2026-07-28
#Languages#Mobile#React Native#Flutter#Swift#Kotlin

When engineering high-scale mobile applications, developers face a core architectural choice: build pure Native apps (using Swift for iOS and Kotlin for Android) or adopt Hybrid Cross-Platform frameworks (such as React Native or Flutter).

While hybrid frameworks accelerate feature delivery with single-codebase development, they introduce runtime abstractions and performance trade-offs.


1. Summary & Key Takeaways

  • Pure Native (Swift / Kotlin): Compiles directly into native ARM64 machine instructions. Zero bridge or thread-marshalling overhead. Provides direct access to Metal/Vulkan GPU APIs and lowest RAM overhead (~35MB baseline).
  • React Native (JavaScript Interface / JSI): Runs JavaScript code inside the Hermes engine. Uses C++ JSI (JavaScript Interface) bindings to invoke native platform UI views asynchronously.
  • Flutter (Dart + Skia / Impeller C++ Canvas): Bypasses native OS platform widgets entirely. Renders pixels directly to an embedded C++ GPU canvas powered by the Impeller or Skia rendering engines.

2. Interactive Mobile Software Stack Simulator

Trace UI events down every software layer - from high-level JavaScript/Dart business logic down to C++ FFI bridges, layout trees, and GPU hardware pipelines - across Swift/Kotlin, React Native, and Flutter!

Software Stack Layer Experiment

Select a stack (Native, React Native JSI, or Flutter Impeller) and click “Trace UI Event Down Stack” to observe how touch events propagate across thread contexts to the GPU!

Mobile Stack Layer Execution Simulator

Trace UI event dispatch down all layers of the software stack to the GPU

React Native Stack (JSI / Hermes Engine)Total Stack Delay: 2.4 ms (Thread Marshalling)
1. JS App BundleReact / TypeScript Business Logic
JS Thread
2. Hermes JS EngineBytecode Execution & Garbage Collection
JS Thread
3. JSI C++ Host ObjectsDirect C++ Function Pointers (Zero JSON serialization)
Bridge FFI
4. Shadow Tree & YogaC++ Flexbox Layout Engine Calculation
Shadow Thread
5. Native Platform ViewsUIKit / Android View Hierarchy Mutation
Main Thread
6. Hardware GPU PipelineMetal / Vulkan Rendering
GPU HW

3. Deep Architecture Comparison

graph TD
    subgraph Pure Native Architecture
    SW["Swift / Kotlin App"] --> OS1["iOS / Android Platform Views"]
    OS1 --> SCREEN1["Display Hardware"]
    end

    subgraph React Native Architecture
    JS["JavaScript / Hermes Engine"] --> SHADOW["React Shadow Tree"]
    SHADOW --> OS2["Native Platform Views"]
    OS2 --> SCREEN2["Display Hardware"]
    end

    subgraph Flutter Architecture
    DART["Dart Code"] --> IMP["Impeller / Skia GPU Engine"]
    IMP --> SCREEN3["Display Hardware"]
    end

4. Code Comparison: Platform API Execution

Compare side-by-side platform sensor stream implementations across Swift (iOS), Kotlin (Android), React Native (TypeScript), and Flutter (Dart) below:

Mobile Platform API Execution Comparison
code_example.swift
Swift (iOS Native)
import UIKit
import CoreMotion

// Pure Native Swift: Direct execution on native main thread (0.0ms overhead)
class NativeMotionManager {
    private let motion = CMMotionManager()

    func startAccelerometer() {
        // Direct C/Swift FFI call into Apple CoreMotion framework
        motion.startAccelerometerUpdates(to: .main) { data, error in
            guard let data = data else { return }
            print("X: (data.acceleration.x), Y: (data.acceleration.y)")
        }
    }
}

5. Mobile Framework Comparison Matrix

MetricPure Native (Swift/Kotlin)React Native (Hermes JSI)Flutter (Dart Impeller)
Execution LayerNative ARM64 BytecodeJS Engine + C++ JSI BindingsNative AOT Dart Bytecode
UI Render EngineNative Platform ControlsNative Platform Controls (Bridged)Custom C++ Skia / Impeller Canvas
Bridge Overhead0.0ms (Direct Native Call)~2.5ms (Thread Marshalling)~0.8ms (Platform Channel FFI)
Base RAM Footprint~35 MB~85 MB (Hermes Engine)~65 MB
Developer VelocityDual Codebase (Slower)High (Hot Reload + Shared Code)High (Hot Reload + Single Codebase)