web-dev-qa-db-ja.com

JNIタイプをネイティブタイプに変換する

jstringをネイティブ文字列(string nativeString = env->GetStringUTFChars(jStringVariable, NULL);)に変換することに関するドキュメントはありますが、jbooleanboolに変換する例は見つかりません。 jintからintへ。

誰もこれを達成する方法を提案できますか?

48
Graeme

Cスタイルのキャストを使用してjintto intをキャストするだけです。 jbooleanからbool(C99 boolタイプを使用している場合)またはuint8_t(std int型を使用している場合)またはunsigned char

開いた $NDK_ROOT/platforms/Android-8/Arch-arm/usr/include/jni.hjintjbooleanなどはtypedefsにすぎません。

56
Gregory Pakosz

jboolean(値はJNI_FALSEまたはJNI_TRUE)ネイティブboolに次のようなものを使用します。

(bool)(jboolean == JNI_TRUE)

おそらくjbooleanがJVMから来ていない場合は、jboolean != JNI_FALSEはより安全であると考えられるかもしれません。

24

同じ問題-修正済み。私の場合、openFrameworksを使用しているので、これが非openFrameworksプロジェクトに当てはまるかどうかはわかりません(テストされていません)。ただし、外部関数の最初の2つの引数は常に「env」と「thiz」であり、これらは新しいextern関数ごとに明示的に定義する必要があるようです。

extern "C"{

// casts the variable properly
void Java_com_package_JavaClass_someFunction( JNIEnv*  env, jobject  thiz, jboolean yourBool ){
    myTestApp->someFunction( (bool) yourBool );
}

// "yourBool" will always be "1" because its taking the spot of "thiz" which is not null
void Java_com_package_JavaClass_someFunction( JNIEnv*  env, jboolean yourBool ){
    myTestApp->someFunction( (bool) yourBool );
}

// "yourBool" will always be "1" because its taking the spot of "env" which is not null
void Java_com_package_JavaClass_someFunction( jboolean yourBool ){
    myTestApp->someFunction( (bool) yourBool );
}


}
3
Steven

If(..)ステートメントで使用したい場合、これは変換せずに機能しています:

if (jboolean == true) {
  return true;
} else {
  return false;
}
1
zajac.m2

奇妙なものはjcharです。これはunsigned shortとして定義され、コンパイル設定に応じて、wchar_tと同等である場合とそうでない場合があります。基盤となるプラットフォームによっては、UTF8文字列を使用したほうがよい場合があります。少なくとも、これらはビット単位でASCII ASCII文字のサブセットに対して。

ただし、WindowsおよびMac OS/Cocoaでは、ネイティブのワイド文字列表現は正確にunsigned shortです。 Java文字列はそれに自然に適合します。

1
Seva Alekseyev