GW中にAndroidでRustを動かして遊んだ話

お久しぶりです。先月末に育休から復帰しました。

そして数日前からRustを学んでいて、元々の専門分野がAndroid/iOSなので、Android NDKでRustを動かそう！と思い立ちました。

# GitHub repository
https://github.com/tonionagauzzi/RustAndroidSample

# やったこと
1. Rust for Androidで必要なものを入れる（[Readme#how-to-setup-this-project](https://github.com/tonionagauzzi/RustAndroidSample#how-to-setup-this-project)）
2. Android Studioで新規プロジェクト作成、Native C++を選択（[diff](https://github.com/tonionagauzzi/RustAndroidSample/commit/040ad817223cda5d4a75f3bf5e57d483dae2fa7d)）
3. C++のJNIをRustに置き換え（[diff](https://github.com/tonionagauzzi/RustAndroidSample/commit/c7874b15bfa23a6f90a0641c3e335a4ef79bbe25)）
4. Hello Worldをちょっとしたものに作り替え（[diff](https://github.com/tonionagauzzi/RustAndroidSample/commit/6df58569e0665720fc6750ec48baa7b74318eada)）

# できたもの
<img width=240 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277107/a75b84cb-6728-272e-6bb3-27fd310ee0c6.png />
Rust勉強目的で作った[generator](https://github.com/tonionagauzzi/RustAndroidSample/blob/6df58569e0665720fc6750ec48baa7b74318eada/app/src/main/rust/hello/src/generator.rs)モジュールで、人のプロフィールっぽい情報を生成し、それをKotlin側で表示するアプリです。

* 2021/5/6更新 趣味を5つ持たせる機能を追加しました（[diff](https://github.com/tonionagauzzi/RustAndroidSample/commit/14bd957733e538229c3db869abbd8c82affa14d0)）

<img width=180 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277107/4fb6ea5e-ab6f-4dfb-7474-6d47247c1c27.png />  <img width=180 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277107/acc8deae-f97a-3995-8260-d8939829c4d7.png /> 
<img width=180 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277107/375c0416-1e47-119b-68b3-1a6c93ed001c.png />

起動する度に様々な人のプロフィールが作られます。小説のキャラクター作りに使えるかもしれません。

仕様は以下です。
* 日本人名であり得ない頭文字は出ない。'X'とか
* だいたい18歳〜54歳の人とマッチングする（生後6667日〜19999日の範囲）
* 趣味は[60の配列](https://github.com/tonionagauzzi/RustAndroidSample/commit/14bd957733e538229c3db869abbd8c82affa14d0#diff-88526ba1628fcf94d4290396f6ee756419a6a47208f885e6163b5bb7dd94b590R13)から[重複しない5つ](https://github.com/tonionagauzzi/RustAndroidSample/commit/14bd957733e538229c3db869abbd8c82affa14d0#diff-88526ba1628fcf94d4290396f6ee756419a6a47208f885e6163b5bb7dd94b590R112-R128)が選ばれる

なお当初は円周率1億桁の計算をKotlinとRustで性能比較するアプリの予定でしたが、それなりに数学の知識を求められたのと、最初から1機能ガッツリ作るよりまず日付型を扱うとかありがちな処理から始めて基礎を固めたかったので、こういう形に方針転換しました。

# 開発環境について
<img width=100% src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277107/76d8f4fc-7165-b789-6df5-6782c4eab492.png />
懸念されたAndroid Studio上でのRustコーディングですが、コンパイルエラーの原因究明時は特に困りませんでした。

しかし、rsファイルの強調表示や補完を使えず、Rustのプラグインも本日時点では見つからなかったので、Rustプラグインを入れたVSCodeで書くほうが便利でした。

# 苦労したこと

文字列型の種類で、場所によってString、jstring、CString、&strをそれぞれ要求されて、C++の案件で受けた洗礼を思い出しました。

[ここ](https://github.com/tonionagauzzi/RustAndroidSample/commit/14bd957733e538229c3db869abbd8c82affa14d0#diff-3df288fcc713bb0e6304c6f159c399f229a2076e3f714ea9c14b2e8df71690a7R59-R72)はStringの配列をKotlinに渡そうと苦労した部分です。`new_object_array`と`set_object_array_element`でできることを知り、四苦八苦の末に一応動いたが、書き方として適切なんだろうか。

また、長らくKotlin/Swiftやってた身としてはクレートやスライスなど慣れない概念もあり、まだまだ勉強不足を感じました。今回作ったアプリを弄ったりしながら覚えていこうと思います💪

# 参考にしたサイト
* [Android NDK で Rust は使えるのか？調査してみた](https://note.com/navitime_tech/n/n7c758204b362)
* [Rustで日付、時刻を計算する](http://kikei.github.io/rust/2018/11/24/rust-chrono.html)
* [Generate random numbers within a range - Rust Cookbook](https://rust-lang-nursery.github.io/rust-cookbook/algorithms/randomness.html#generate-random-numbers-within-a-range)