Upgrade to Pro — share decks privately, control downloads, hide ads and more …

FlutterとAndroidの 連携を変えるかもしれないjni

FlutterとAndroidの 連携を変えるかもしれないjni

Mikami Hiroki

May 22, 2023
Tweet

More Decks by Mikami Hiroki

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    🤔

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  12. 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
    を扱う

    View Slide

  13. 4ステップで導入できる

    View Slide

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

    View Slide

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

    View Slide

  16. jnigen.yamlのイメージ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  25. 補足・参考
    ● 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

    View Slide

  26. 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

    View Slide

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

    View Slide