Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Nativeコードからの値をStateFlowで受け取ってみた
Search
kazaman
December 22, 2020
Programming
0
1.5k
Nativeコードからの値をStateFlowで受け取ってみた
kazaman
December 22, 2020
Tweet
Share
Other Decks in Programming
See All in Programming
Web フロントエンドエンジニアに開かれる AI Agent プロダクト開発 - Vercel AI SDK を観察して AI Agent と仲良くなろう! #FEC余熱NIGHT
izumin5210
3
530
はじめてのDSPy - 言語モデルを『プロンプト』ではなく『プログラミング』するための仕組み
masahiro_nishimi
2
490
Claude Agent SDK を使ってみよう
hyshu
0
590
なぜあの開発者はDevRelに伴走し続けるのか / Why Does That Developer Keep Running Alongside DevRel?
nrslib
3
410
All About Angular's New Signal Forms
manfredsteyer
PRO
0
160
チームの境界をブチ抜いていけ
tokai235
0
180
Server Side Kotlin Meetup vol.16: 内部動作を理解して ハイパフォーマンスなサーバサイド Kotlin アプリケーションを書こう
ternbusty
3
190
Writing Better Go: Lessons from 10 Code Reviews
konradreiche
0
1.3k
What's new in Spring Modulith?
olivergierke
1
150
After go func(): Goroutines Through a Beginner’s Eye
97vaibhav
0
390
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
350
NixOS + Kubernetesで構築する自宅サーバーのすべて
ichi_h3
0
860
Featured
See All Featured
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Optimizing for Happiness
mojombo
379
70k
Facilitating Awesome Meetings
lara
56
6.6k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.5k
Build The Right Thing And Hit Your Dates
maggiecrowley
37
2.9k
Raft: Consensus for Rubyists
vanstee
140
7.1k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
46
7.7k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.7k
The Invisible Side of Design
smashingmag
302
51k
Fireside Chat
paigeccino
40
3.7k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
A designer walks into a library…
pauljervisheath
209
24k
Transcript
Nativeコードからの値を StateFlowで受け取ってみた potatotips #72 2020/12/22(Tue) kazaman97
自己紹介 kazaman 株式会社ゼネテック : 社会人 1 年目 Android ハマっている! でも歴としては、空いてる期間もあるけど
1 年くらい 最近業務の方でも行うようになった potatotips 初参加にして初発表なので温かい目で、、、 github: @kazaman97
なんでこの議題なの?? 業務で NDK を使い Native コードを Android 上で動かす必要があった Native 側では、処理が終わるまで常に動作させており、結果を出力し続ける
その結果を受け取り、画面に表示させなければならない! しかし、 ( 自分が ) やり方を見つけられなかったで自分なりに行ってみた!
(Android Dagashi より [ https://androiddagashi.github.io/issue/147-2020-11-22/ ]) なにかいい方法がないかと 探していたら見つけた記事 このStateFlowを 使えばうまいこと
できそう??
StateFlow StateFlow は、状態保持用の監視可能な Flow で、現在の状態や状態更新の情報をコレ クタに出力します。 (https://developer.android.com/kotlin/flow/stateflow-and-sharedflow より引用 ) StateFlowを使えばNativeからの最新値を常に受け取れそう!
StateFlowの使い方 1 2 3 1. 外からは値の変更をできないようにし、 更新された値を流せるようにするため、 privateでMutableStateFlowを定義する 2. 外からは読み取り専用でアクセスできるようにするため、
StateFlowにする 3. 値を発行させる箇所に、 定義したMutableStateFlowのvalueに値を入れる 初期値が必要!
サンプルで作成したアプリ 1. EditText にカウントダウンしたい 数値を入れる 2. 「スタート」ボタンを押したら 入力した数値が TextView に表示さ
れ、 1 秒ずつカウントダウンを開始する 3. 0 もしくは「ストップ」ボタンを押したらカ ウントダウンが終了する カウントダウンアプリ画面 カウントダウン処理を Nativeで行わせる https://github.com/kazaman97/sample-jni-flow
Nativeコード 1 秒ずつカウントダウンする C++ コード 1. start 関数を呼んだら カウントダウン処理を実行する 2.
カウントダウン処理時中に 現在のタイムを出力し続ける 3. カウント処理が 0 になる、もしくは stop 関 数を呼んだら止まる スタート処理 ストップ処理 カウント ダウン処理 JVM側に値を 渡す処理
Nativeの関数呼び出し `start` 関数を呼び出すと Native 側のコードが呼び出される `onUpdateTime` は Native 側から、 現在のカウントダウン値を渡すときに呼ば
れる `currentTime` で 今回 UI 側に値渡しする StateFlow Native 実装やり取りをするためのコード Nativeからの値 を受け取る
①. JNI(Nativeコードとマネージ コードを連携するインターフェース ) を使ってJVM側に 値を渡す 値を渡す ②. MutableStateFlowに値を渡す ③.
値を受け取るときは 使いたい箇所でcollectするだけ!
UI側での処理 コルーチンを作成し、その中で、 collect す る collect して受け取った値を TextView に セットする
1 秒ずつカウントダウンする C++ コード
実際の動作 実際に動かしてみると、 Native で処理したカウントダウン値がしっか り流れてきている!
まとめ StateFlow を使うと Native 側の値を簡単に受け取り UI 反映ができる コルーチンを使っているのでバックグラウンドスレッドで値受け取りもできる 業務の方は、まだ Listener
方式で直していない
ご清聴ありがとうございました♂