公開日:2020/06/05更新日:2020/08/03
【Kotlin】C++側から、Kotlinの変数を呼び出す方法を解説

- C++側から、Kotlinの変数を取得したい。
ネイティブコードを利用したアプリを開発をしている中で、C++側から、Kotlin側の変数を取得したい場合があるかもしれません。
本記事では、そんな方々に向け、C++側からKotlinの変数を呼び出す方法を解説致します。
なお、C++側から、Kotlinの関数を呼び出す処理に関しましては、以下の記事にて解説しておりますので、あわせてご覧ください。
目次
Kotlin側に、C++から取得したい変数を実装する
まずは、Kotlin側に、C++から取得したい変数を実装します。
Sample.kt
様々な型の変数を実装しました。
ポイントとしましては、companion objectで、Singletonとして宣言することです。
C++側に、Kotlinの変数を取得する処理を実装する
JavaVMの保存とJNIEnvの取得
続いて、C++側に、Kotlinの変数を取得する処理を実装していきます。
Kotlin側の変数の取得には、FindClassや、GetStaticFieldIDなどの、JNI関数の実装がとなるため、まず、JNIEnvを取得する処理を実装します。
Sample.h
Sample.cpp
JNI_OnLoad()は、ネイティブライブラリがロードされたタイミング(System.loadLibrary等)で呼び出される関数です。JNI_OnLoad()が呼び出された際に、static変数のsavedVmに、引数で渡ってきたJavaVMを格納するようにしております。
getEnv()は、JNIEnvが必要となった時に呼ばれることを想定した関数です。static変数のsavedVmからJNIEnvを取得し、呼び出し元へ返します。
Kotlinの変数の取得処理の実装
続いて、Kotlinの変数の取得処理を実装致します。
Sample.cpp
8行目のgetEnv()で、JNIEnvを取得しております。
11行目のFindClass()では、Kotlin側の呼び出したいクラスを取得しております。引数には、クラス名を指定します。
14〜16行目は、Kotlin側に実装したfloatField変数を取得する処理です。
まず、GetStaticFieldID()で、変数のIDを取得しております。
第1引数には、FindClassで取得したクラス
第2引数には、取得したい変数名
第3引数には、変数のシグネチャ
を指定します。
そして、GetStaticFloatField()に、クラスと、変数のIDを指定し、Kotlin側に実装したfloatField変数を取得しております。
また、変数をログで出力するようにしております。
以降の処理は、各変数ごとの取得処理です。シグネチャと、GetStatic〇〇Field()を、それぞれの型に合わせて変更しております。
出力結果
D/C++: LOG: Float 10
D/C++: LOG: Double 20
D/C++: LOG: Char 30
D/C++: LOG: Short 40
D/C++: LOG: Int 50
D/C++: LOG: Long 60
D/C++: LOG: Byte 70
D/C++: LOG: Boolean 1
D/C++: LOG: String string
D/C++: LOG: IntArray 1
D/C++: LOG: IntArray 2
D/C++: LOG: IntArray 3
D/C++: LOG: IntArray 4
D/C++: LOG: IntArray 5
以上、C++側から、Kotlinの変数を取得する方法の解説でした。
最後までご覧いただき、ありがとうございました。