DartからRustを呼び出すための調査メモ
背景
デスクトップアプリでFlutterを使いたい
FlutterはDartで書かれている
諸々の処理自体はRustですでに揃っているので、FlutterからRustを利用できるようにしたい
Dart入門
言語仕様
公式。長い
ぱぱっと雰囲気を掴みたいだけならこれを読めばいいかもしれない(日本語で書いてくれているので)
動かしてみる
Dart SDKのインストール
これでDartのプログラムをローカルで実行できるようになる
Hello World
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って書いてた
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.
まだ実装中
FFIが持つ基本機能について言及
C/C++をDartから呼べるようにするのが2019のロードマップ
これはFlutterのロードマップだが、実質Dart?(Dartでは呼べるけどFlutterでは現状辛いという話なのか?)
現状直接は厳しいのでJava or Swiftを経由して呼び出す
まだC/C++を直接Dartから呼び出すことはできないという結論でOK?
頑張れば呼べる?未だに呼べるかどうかがよくわからん
FlutterからJavaやObjectiveC、Swiftのコードは呼べるぽい
Dart本体からは直接呼べないんだけど、Flutterアプリを作る際にJava, Kotlin, ObjectiveC, Swiftを通せば呼べるという仮説
ex) Flutter -> Java -> C(JavaからCのコードを呼び、そのJavaのコードをFlutterが使う)
この記事では頑張ってC++のコードを呼び出しているように見えるが。。。
FlutterでC/C++のコードを呼び出す
AndroidではAndroid NDK(Native Development Kit)と呼ばれるツールが有り、C/C++のコードをAndroidで使えたり、C/C++のライブラリを利用できたりする
iOSアプリの場合、少なくともObjectiveCはC, C++をそのまま呼べる(らしい)ので、AndroidにおけるNDKに該当するものは不要
C/C++ lib <---binding---> Swift/ObjC <---platform channel---> Dart
C/C++ lib <-----JNI-----> Java/Kotlin <---platform channel---> Dart
C/C++に関してはこれで確定
DartからRustを呼び出しているプロジェクト例
RustとFlutterのサンプルアプリがいくつかある
一旦Androidで動いたぜっていう報告
FlutterでRustのコードを使う場合、AndroidならJava, iOSならSwiftなどOSごとに経由する環境が違うので結構めんどくさい説はある
Flutterでデスクトップアプリを作る
Flutterはデスクトップアプリの作成に関してはまだおまけ的ポジション
macOSは対応済み、windowsとLinuxは対応済みだけどearly experimental(予告なく仕様が変わるかも)
そのせいか、公式ドキュメントにはiOSとAndroidの記述がほとんど(検索してもヒットしない)
Flutter for Desktop自体が2019/5月に発表されたらしい
当たり前だけど、iOSやAndroidに依存する機能は使えないよ〜とのこと
きっと各プラットフォームごとのカスタマイズはできるはず(見た目とか)