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です
でこれ入れます
使い方は書いてあるとおりです
"cargo ndk --platform 30 --target {ターゲット} build --release"
いろんな端末に対応するならターゲットをそれぞれ作ります
今回はこれを書き記したかったので記事書きました
なんかmake使ったりとかでiOS用ヘッダも一緒に吐けるよみたいなのあったんですが
そういうの使いたくなかったから
同じように人がいるだろうなと
以下は既存の記事とかと一緒です
でてきたものをmain/jniLibs/{ターゲット}/{出てきたlib}.so的に置きます
- arm64-v8a
- armeabi-v7a
- x86
ちなみにぼくはarm64のでしか試してないです
Flutterでffi入れます
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>"
呼び出しは普通に関数変数みたいに使えばいいですね
なんかあったら教えて下さい