2021/12/04 Piyogrammer Conference 2021にて発表
Kotlin/NativeからCの標準ライブラリを呼び出そう2021/12/04 Piyogrammer Conference
View Slide
自己紹介HN: マヤミトID: yt8492会津大学 学部4年普段はAndroidアプリ書いたりサーバー書いたり今回のイベントの運営でもありますGitHub: https://github.com/yt8492趣味: Kotlin, Twitter, ウマ娘Twitter: yt8492
Kotlin/Nativeとは?- KotlinのコードをJavaのバイトコード以外にコンパイルする技術- VMなしで実行可能なバイナリ- C/C++向けのライブラリとCヘッダ- Swift/Objective-C向けのApple framework- 当然JavaのライブラリやJVMのみをターゲットとしたKotlinのライブラリは使えない😇- 目的のtargetに対応したKotlinのライブラリを使う- 目的のtargetの処理をブリッジを書いて Kotlinでラップする
Kotlin標準ライブラリでできることは意外と限られている- Javaの標準ライブラリが普通にKotlinから使えるおかげで普段意識しないが、実はKotlinの標準ライブラリではファイル操作やソケット通信などは提供されていない- kotlinx-ioというライブラリが公式で開発中だが、ファイル操作もソケット通信もまだできない 😇
KotlinからCの標準ライブラリを呼び出そう(本題)- fopenとかをKotlin/Nativeから呼び出せばいいじゃん!- とはいえ自力でブリッジを書くのはあまりにもしんどい- Kotlin/Native向けにplatform librariesという形でCの標準ライブラリの関数などをそのままKotlinから使えるようにしたラッパーが公式で提供されている
簡単な例
Cのprintfが呼び出せた🎉
とはいえそんなに単純に済む話じゃない- KotlinとCのそもそもの言語仕様の違い- Kotlinは変数の宣言と代入はセットだが、 Cは変数宣言だけしてポインタを関数に渡すなどができる- KotlinはGCがあるけどCにはない- Kotlinにポインタの概念はない- などなど
KotlinでCの変数のメモリ確保など- memScopedという関数に渡すブロックの中でallocなどの関数が使える- このスコープを抜けると確保したメモリは開放される- ポインタは ptr という拡張プロパティで取得できる
Cの値とポインタをKotlinで扱う- allocで確保できる型はCVariable型を継承した型のみ- Kotlinのプリミティブ型(Intなど)がallocできないじゃん!- プリミティブ型用にCVariable型を継承したIntVar型などが用意されている- CVariable型が継承しているCPointed型には、ptrという拡張プロパティが生えている- ptrはCPointer型
Kotlin/NativeでTCPのソケット通信をecho backする例- yt8492/NativeServerhttps://github.com/yt8492/NativeServer- Cのsocket関数などをKotlinでラップしてJavaのSocketまわりの標準ライブラリに近いものを自作- それを使う形でecho backを実装
これでみなさんもCのコードをKotlinに脳内変換できるようになりましたね?
みんなもKotlin/Native、しよう!