Genta Hirauchi

公開日:2020/06/05
更新日:2020/08/03

【Kotlin】C++側から、Kotlinの変数を呼び出す方法を解説

  • C++側から、Kotlinの変数を取得したい。

ネイティブコードを利用したアプリを開発をしている中で、C++側から、Kotlin側の変数を取得したい場合があるかもしれません。

本記事では、そんな方々に向け、C++側からKotlinの変数を呼び出す方法を解説致します。

なお、C++側から、Kotlinの関数を呼び出す処理に関しましては、以下の記事にて解説しておりますので、あわせてご覧ください。

【Kotlin】C++側から、Kotlinのコードを呼び出す方法を解説

ネイティブコードを利用したアプリを開発において、Java/Kotlin側からC/C++のコードは呼び出せるけれど、C/C++側からJava/Kotlinのコードを呼び出す方法がわからないという方がいらっしゃると思います。本記事では、C/C++側からJava/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の変数を取得する方法の解説でした。
最後までご覧いただき、ありがとうございました。