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

Nativeコードからの値をStateFlowで受け取ってみた

E1db053f2c2f3d3b49a5f5b9b0c7f20f?s=47 kazaman
December 22, 2020

 Nativeコードからの値をStateFlowで受け取ってみた

E1db053f2c2f3d3b49a5f5b9b0c7f20f?s=128

kazaman

December 22, 2020
Tweet

Transcript

  1. Nativeコードからの値を StateFlowで受け取ってみた potatotips #72 2020/12/22(Tue) kazaman97

  2. 自己紹介 kazaman 株式会社ゼネテック : 社会人 1 年目 Android ハマっている! でも歴としては、空いてる期間もあるけど

    1 年くらい 最近業務の方でも行うようになった potatotips 初参加にして初発表なので温かい目で、、、 github: @kazaman97
  3. なんでこの議題なの?? 業務で NDK を使い Native コードを Android 上で動かす必要があった Native 側では、処理が終わるまで常に動作させており、結果を出力し続ける

    その結果を受け取り、画面に表示させなければならない! しかし、 ( 自分が ) やり方を見つけられなかったで自分なりに行ってみた!
  4. (Android Dagashi より [ https://androiddagashi.github.io/issue/147-2020-11-22/ ]) なにかいい方法がないかと 探していたら見つけた記事 このStateFlowを 使えばうまいこと

    できそう??
  5. StateFlow StateFlow は、状態保持用の監視可能な Flow で、現在の状態や状態更新の情報をコレ クタに出力します。 (https://developer.android.com/kotlin/flow/stateflow-and-sharedflow より引用 ) StateFlowを使えばNativeからの最新値を常に受け取れそう!

  6. StateFlowの使い方 1 2 3 1. 外からは値の変更をできないようにし、 更新された値を流せるようにするため、 privateでMutableStateFlowを定義する 2. 外からは読み取り専用でアクセスできるようにするため、

    StateFlowにする 3. 値を発行させる箇所に、 定義したMutableStateFlowのvalueに値を入れる 初期値が必要!
  7. サンプルで作成したアプリ 1. EditText にカウントダウンしたい 数値を入れる 2. 「スタート」ボタンを押したら 入力した数値が TextView に表示さ

    れ、 1 秒ずつカウントダウンを開始する 3. 0 もしくは「ストップ」ボタンを押したらカ ウントダウンが終了する カウントダウンアプリ画面 カウントダウン処理を Nativeで行わせる https://github.com/kazaman97/sample-jni-flow
  8. Nativeコード 1 秒ずつカウントダウンする C++ コード 1. start 関数を呼んだら カウントダウン処理を実行する 2.

    カウントダウン処理時中に 現在のタイムを出力し続ける 3. カウント処理が 0 になる、もしくは stop 関 数を呼んだら止まる スタート処理 ストップ処理 カウント ダウン処理 JVM側に値を 渡す処理
  9. Nativeの関数呼び出し `start` 関数を呼び出すと Native 側のコードが呼び出される `onUpdateTime` は Native 側から、 現在のカウントダウン値を渡すときに呼ば

    れる `currentTime` で 今回 UI 側に値渡しする StateFlow Native 実装やり取りをするためのコード Nativeからの値 を受け取る
  10. ①. JNI(Nativeコードとマネージ コードを連携するインターフェース ) を使ってJVM側に 値を渡す 値を渡す ②. MutableStateFlowに値を渡す ③.

    値を受け取るときは 使いたい箇所でcollectするだけ!
  11. UI側での処理 コルーチンを作成し、その中で、 collect す る collect して受け取った値を TextView に セットする

    1 秒ずつカウントダウンする C++ コード
  12. 実際の動作 実際に動かしてみると、 Native で処理したカウントダウン値がしっか り流れてきている!

  13. まとめ StateFlow を使うと Native 側の値を簡単に受け取り UI 反映ができる コルーチンを使っているのでバックグラウンドスレッドで値受け取りもできる 業務の方は、まだ Listener

    方式で直していない
  14. ご清聴ありがとうございました‍♂