FlutterからRustのLibを呼び出すやつ

ども

ググってもいい感じにまとまってるの見つけられなかったのでメモとして書いといきます

今回試したのはAndroidのみです

基本的には既存記事の内容と同じです

.soを吐くくだりが分かりづらかったのでそこをここでは書きます

 

まず普通にRustのLibが作れるまでのプロジェクトを用意します

もちろん#[no_mangle]つけます

rustupのtargetをaddします

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

NDKインストールします

たぶんAndroid Studioのside by sideがいんじゃねって思います

環境変数を足します

ANDROID_NDK_HOMEです

でこれ入れます

github.com

使い方は書いてあるとおりです

"cargo ndk --platform 30 --target {ターゲット} build --release"

いろんな端末に対応するならターゲットをそれぞれ作ります

今回はこれを書き記したかったので記事書きました

なんかmake使ったりとかでiOS用ヘッダも一緒に吐けるよみたいなのあったんですが

そういうの使いたくなかったから

同じように人がいるだろうなと

以下は既存の記事とかと一緒です

 

でてきたものをmain/jniLibs/{ターゲット}/{出てきたlib}.so的に置きます

  • arm64-v8a
  • armeabi-v7a
  • x86

ちなみにぼくはarm64のでしか試してないです

Flutterでffi入れます

pub.dev

libの読み込みはこう書くそうです

final DynamicLibrary {ライブラリ変数} = Platform.isAndroid
? DynamicLibrary.open("{libの名前}.so")
: DynamicLibrary.process();

 

関数はこう書くそうで

typedef {関数型名} = {戻り値型} Function({引数型s});
typedef {関数型名}FFI ={戻り値型} Function({引数型s});

final {関数型} {関数名} ={ライブラリ変数}
.lookup<NativeFunction<{関数型名}FFI>>("{lib内の関数名}")
.asFunction();

これなんで二個同じの書かないといけないんすかね

引数と戻り値の型はffiのPointerを使うそうです

Like a "Pointer<Utf8>"

 

呼び出しは普通に関数変数みたいに使えばいいですね

なんかあったら教えて下さい