Slide 1

Slide 1 text

<< FlutterとAndroidの 連携を変えるかもしれないjni DroidKaigi.collect{ #3@Tokyo }

Slide 2

Slide 2 text

● 株式会社ゆめみ ● AndroidとFlutterをぼちぼち ● Twitter: @mono33__ みかみ

Slide 3

Slide 3 text

[1] Rethinking Dart interoperability with Android, https://youtu.be/ZWp2FJ2TuJs

Slide 4

Slide 4 text

アジェンダ 1. 従来のネイティブ連携 2. jni パッケージについて 3. まとめ

Slide 5

Slide 5 text

アジェンダ 1. 従来のネイティブ連携 2. jni パッケージについて 3. まとめ

Slide 6

Slide 6 text

Flutter標準のネイティブ連携 ● プラットフォーム固有の機能やAPIは直接扱えない ● MethodChannelなど、メッセージによってFlutterと ネイティブ間の連携を可能にする仕組み[2] [2] Writing custom platform-specific code, https://docs.flutter.dev/platform-integration/platform-channels Flutter Android MethodChannel

Slide 7

Slide 7 text

MethodChannelの問題点 ● クラスの指定や引数、メソッド名を文字列で扱う必要があ る 🤔

Slide 8

Slide 8 text

Pigeonパッケージの登場 ● Flutterとネイティブ間で型安全な連携を可能にする コード生成ツール[3] ● Dartでスキーマを記述し、Flutterとプラットフォームの共通 のインターフェースとなるコードを自動生成 [3] Pigeon, https://pub.dev/packages/pigeon

Slide 9

Slide 9 text

Pigeonのイメージ Flutter Android インターフェース .dart Pigeon インターフェース 1. スキーマの定義 2. 自動生成 3. それぞれ実装

Slide 10

Slide 10 text

アジェンダ 1. 従来のネイティブ連携 2. jni パッケージについて 3. まとめ

Slide 11

Slide 11 text

jniパッケージの概要 ● Dart / Flutter から Java Native Interface(JNI) への アクセスをサポートするパッケージ[4] ● Android側でDartと連携する処理が不要 🎉 ○ DartだけでAndroid側の処理を呼び出せる ○ ContextやActivityを取得するメソッドも用意 [4] jin, https://pub.dev/packages/jni

Slide 12

Slide 12 text

jniのイメージ [5] jnigen/README.md, https://github.com/dart-lang/jnigen/blob/main/README.md C bindings dart bindings Flutter Java code JNI jnigen.yaml (設定ファイル) 1. 設定 & 自動生成 2. dart bindings を扱う

Slide 13

Slide 13 text

4ステップで導入できる

Slide 14

Slide 14 text

1. 依存関係の追加 ● pubspec.yamlにjniとjnigen[6]を追加 [6] jnigen, https://pub.dev/packages/jnigen

Slide 15

Slide 15 text

2. 設定ファイル(jnigen.yaml)の記述 ● 自動生成周りの情報を記述 ○ 自作のコードやAndroidXのライブラリやJavaの標準ラ イブラリも呼び出せる ○ もちろんKotlinのコードも

Slide 16

Slide 16 text

jnigen.yamlのイメージ

Slide 17

Slide 17 text

jnigen.yamlのイメージ 生成するコードの設 定

Slide 18

Slide 18 text

jnigen.yamlのイメージ 呼び出したい ものの設定

Slide 19

Slide 19 text

jnigen.yamlのイメージ example.dartに Exampleクラスを呼び出す dart bindingsが生成

Slide 20

Slide 20 text

3. コードの自動生成 ● jnigen.yamlを元にコードを自動生成

Slide 21

Slide 21 text

4. build.gradleの変更 ● jnigenによって生成されるCMakeLists.txtのパスを設定

Slide 22

Slide 22 text

呼び出し DartだけでAndroid側の 処理を呼び出せる

Slide 23

Slide 23 text

アジェンダ 1. 従来のネイティブ連携 2. jni パッケージについて 3. まとめ

Slide 24

Slide 24 text

まとめ ● jniはPigeonとは別アプローチでネイティブ連携を行う ● 癖はあるがDartだけでネイティブの実装を呼び出せる ● まだまだ🚧開発中🚧

Slide 25

Slide 25 text

補足・参考 ● Swift 向けにffi[7]/ffigen[8]が開発されている ● 公式にpedometer[9]というjni・ffiを使った サンプルのリポジトリ [7] ffi, https://pub.dev/packages/ffi [8] ffigen, https://pub.dev/packages/ffigen [9] pedometer, https://github.com/flutter/samples/tree/main/experimental/pedometer

Slide 26

Slide 26 text

References ● [1] Rethinking Dart interoperability with Android, https://youtu.be/ZWp2FJ2TuJs ● [2] Writing custom platform-specific code, https://docs.flutter.dev/platform-integration/platform-channels ● [3] Pigeon, https://pub.dev/packages/pigeon ● [4] jin, https://pub.dev/packages/jni ● [5] jnigen/README.md, https://github.com/dart-lang/jnigen/blob/main/README.md ● [6] jnigen, https://pub.dev/packages/jnigen ● [7] ffi, https://pub.dev/packages/ffi ● [8] ffigen, https://pub.dev/packages/ffigen ● [9] pedometer, https://github.com/flutter/samples/tree/main/experimental/pedometer

Slide 27

Slide 27 text

CREDITS: This presentation template was created by Slidesgo, including icons by Flaticon, infographics & images by Freepik. Thanks!