概要
JNIを使用したAndroidのアプリをKotlinで作成しているとき、JNIの関数にNullableのKotlinのInt値を渡したいということがあった。
Nullableでない値を渡す場合であればネイティブ側でjintとして受け取るところなのだが、Nullableの場合だとエラーが発生してjintは使用できなかった。
そのため、Nullableな値をネイティブ側でjobjectとして受け取った後にjobjectからint値に変換するということを行ったのでその方法を記載する。
JNIでjobjectからint値に変換する方法
以下のようにすることでjobjectをint値に変換することができる。
// JNI関数の定義はKotlin側の別の場所で以下のように定義されている
external fun sampleFunc(value: Int?): Int
// ネイティブ側のコード
// サンプルなので関数名は適当かつ、int値を返すだけのコード
JNIEXPORT jint JNICALL
con_example_app_sampleFunc(JNIEnv *env, jobject nullableValue) {
if (nullableValue != nullptr) {
auto intClass = env->FindClass("java/lang/Integer");
auto intValueMID = env->GetMethodID(intClass, "intValue", "()I");
auto intValue = env->CallIntMethod(nullableValue, intValueMID);
return intValue
}
return -1;
}
また、今回はKotlinのInt値が渡したが応用としてCallIntMethod
をCallFloatMethod
やCallBooleanMethod
などの別の関数にすることでFloat値やBool値の場合でも同じような事ができる。