Code Monkey home page Code Monkey logo

flutterust's Introduction

Flutterust

Flutter + Rust = ❤️

Using Rust libs from Flutter using dart:ffi

It provides out-of-the box support for cross-compiling native Rust code for all available iOS and Android architectures and call it from plain Dart using Foreign Function Interface.

This template provides first class FFI support, the clean way.

  • No Swift/Kotlin wrappers
  • No message passing
  • No async/await on Dart
  • Write once, use everywhere
  • No garbage collection
  • Mostly automated development
  • No need to export aar bundles or .framework's

Project Structure

.
├── android
├── ios
├── lib                     <- The Flutter App Code
├── native                  <- Containes all the Rust Code
│   ├── adder
│   └── adder-ffi
├── packages                <- Containes all the Dart Packages that bind to the Rust Code
│   └── adder
├── target                  <- The compiled rust code for every arch
│   ├── aarch64-apple-ios
│   ├── aarch64-linux-android
│   ├── armv7-linux-androideabi
│   ├── debug
│   ├── i686-linux-android
│   ├── universal
│   ├── x86_64-apple-ios
│   └── x86_64-linux-android
└── test

Setup and Tools

  1. Add Rust build targets

For Android

rustup target add aarch64-linux-android armv7-linux-androideabi x86_64-linux-android i686-linux-android

For iOS

rustup target add aarch64-apple-ios x86_64-apple-ios
  1. Cargo Plugins
cargo install cargo-make

Build and Test

In the Root of the project simply run:

cargo make

Then run flutter app normally

flutter run

How it works?

The simple idea here is that we build our rust code for all supported targets then build a Flutter Package that uses these targets.

In iOS

we build our rust package using cargo-lipo to build a universal iOS static lib from our rust code after that, we symbol link the built library to our package ios directory, copy the generated bindgen.h file to the ios/Classes the Makefile.toml do these steps for us.

Next we need to add these lines to our package podspec file:

  s.public_header_files = 'Classes**/*.h'
  s.static_framework = true
  s.vendored_libraries = "**/*.a"

but Xcode dose some tree shaking and we currently not using our static lib anywhere in the code, so we open our package's ios/Classes/Swift{PACKAGE_NAME}Plugin.swift and add a dummy method there:

 public static func dummyMethodToEnforceBundling() {
    // call some function from our static lib
    add(40, 2)
  }
In Android

In android it is a bit simpler than iOS, we just need to symbol link some libs in the right place and that is it. our build script creates this folder structure for every package we have:

packages/{PACKAGE_NAME}/android/src/main
├── jniLibs
│   ├── arm64-v8a
│   ├── armeabi-v7a
│   └── x86

Make sure that the Android NDK is installed (From SDK Manager in Android Studio), also ensure that the env variable $ANDROID_NDK_HOME points to the NDK base folder and after that, the build script build our rust crate for all of these targets using cargo-ndk and symbol link our rust lib to the right place, and it just works :)

See also

flutterust's People

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.