DartからRustを呼び出すための調査メモ
背景
デスクトップアプリでFlutterを使いたい
FlutterはDartで書かれている
諸々の処理自体はRustですでに揃っているので、FlutterからRustを利用できるようにしたい
Dart入門
言語仕様
https://dart.dev/guides/language/language-tour
公式。長い
https://qiita.com/teradonburi/items/913fb8c311b9f2bdb1dd
ぱぱっと雰囲気を掴みたいだけならこれを読めばいいかもしれない(日本語で書いてくれているので)
動かしてみる
Dart SDKのインストール
https://dart.dev/get-dart
これでDartのプログラムをローカルで実行できるようになる
Hello World
https://doitu.info/blog/5c0e3a398dbc7a001af33ce4
RustのFFIについて
RustはFFIが充実している(らしい)
RustからCはサクッと読み込める(本を読んだ)
externでimportしてアトリビュートを追記するだけ
importしたCのコードの呼び出し箇所はunsafeで囲んであげる必要がある
CからRustを呼ぶ
やり方
成果物をCリンカから扱いやすい形にする
関数名などをCからわかりやすい名前にする
ABIをCと合わせる
Rustは呼ばれる側なのでlibクレートで初期化
各言語で必要なクレートが異なる?
そのクレートをCargo.tomlに記述しておく
(Cの場合?)Rustコンパイラによる名前修飾を抑制するためのアノテーション追加などが必要になる
Cの場合、動的リンクライブラリ?で用意すればCのソースコードに直接Rust専用の記述を用意しなくても良い
PythonからRustを呼ぶ
Cを呼ぶ場合とほぼ一緒っぽい
DartからC/C++を呼び出す
公式にnow develpmentって書いてた
https://dart.dev/server/c-interop
Design and implement Dart VM FFI
2018/9にIssueとして挙がっている
2018/9時点でearly preview版のみ
The present feature tracks the implementation of Dart FFI support enabling interop with C & C++ code from Dart.
まだ実装中
https://github.com/dart-lang/sdk/issues/34452#issuecomment-457176171
FFIが持つ基本機能について言及
https://github.com/firstfloorsoftware/flutter_sodium/issues/12
C/C++をDartから呼べるようにするのが2019のロードマップ
https://github.com/flutter/flutter/wiki/Roadmap
これはFlutterのロードマップだが、実質Dart?(Dartでは呼べるけどFlutterでは現状辛いという話なのか?)
DartからC/C++を使うには?
現状直接は厳しいのでJava or Swiftを経由して呼び出す
まだC/C++を直接Dartから呼び出すことはできないという結論でOK?
https://qiita.com/isyumi_net/items/866f5722b62464caa475
頑張れば呼べる?未だに呼べるかどうかがよくわからん
https://medium.com/47billion/creating-a-bridge-in-flutter-between-dart-and-native-code-in-java-or-objectivec-5f80fd0cd713
FlutterからJavaやObjectiveC、Swiftのコードは呼べるぽい
Dart本体からは直接呼べないんだけど、Flutterアプリを作る際にJava, Kotlin, ObjectiveC, Swiftを通せば呼べるという仮説
ex) Flutter -> Java -> C(JavaからCのコードを呼び、そのJavaのコードをFlutterが使う)
https://qiita.com/isyumi_net/items/866f5722b62464caa475
この記事では頑張ってC++のコードを呼び出しているように見えるが。。。
FlutterでC/C++のコードを呼び出す
AndroidではAndroid NDK(Native Development Kit)と呼ばれるツールが有り、C/C++のコードをAndroidで使えたり、C/C++のライブラリを利用できたりする
https://stackoverflow.com/questions/48773704/is-there-any-ndk-equivalent-on-ios
iOSアプリの場合、少なくともObjectiveCはC, C++をそのまま呼べる(らしい)ので、AndroidにおけるNDKに該当するものは不要
Run C++ code with flutter?
C/C++ lib <---binding---> Swift/ObjC <---platform channel---> Dart
C/C++ lib <-----JNI-----> Java/Kotlin <---platform channel---> Dart
C/C++に関してはこれで確定
DartからRustを呼び出しているプロジェクト例
https://github.com/gliheng/flutter-rs
RustとFlutterのサンプルアプリがいくつかある
https://users.rust-lang.org/t/rust-flutter-for-mobile-applications/22725
一旦Androidで動いたぜっていう報告
FlutterでRustのコードを使う場合、AndroidならJava, iOSならSwiftなどOSごとに経由する環境が違うので結構めんどくさい説はある
Flutterでデスクトップアプリを作る
https://github.com/flutter/flutter/wiki/Desktop-shells
Flutterはデスクトップアプリの作成に関してはまだおまけ的ポジション
macOSは対応済み、windowsとLinuxは対応済みだけどearly experimental(予告なく仕様が変わるかも)
そのせいか、公式ドキュメントにはiOSとAndroidの記述がほとんど(検索してもヒットしない)
https://qiita.com/karuhi/items/22dc9abd77890da8773c
Flutter for Desktop自体が2019/5月に発表されたらしい
https://medium.com/@TonyMew/how-to-build-flutter-app-to-run-on-desktop-86e492aea321
当たり前だけど、iOSやAndroidに依存する機能は使えないよ〜とのこと
きっと各プラットフォームごとのカスタマイズはできるはず(見た目とか)