web-dev-qa-db-fra.com

Convertir les types JNI en types natifs

Bien qu'il existe de la documentation concernant la transformation d'un jstring en une chaîne native (string nativeString = env->GetStringUTFChars(jStringVariable, NULL);) je ne trouve pas d'exemple qui convertira un jboolean en bool ou un jint vers un int.

Quelqu'un peut-il suggérer comment cela est réalisé?

48
Graeme

Il vous suffit de transtyper jintto int à l'aide de transtypages de style C. Idem pour jboolean à bool (si vous utilisez le type C99 bool) ou à uint8_t (si vous utilisez des types std int) ou vers unsigned char.

Ouvrir $NDK_ROOT/platforms/Android-8/Arch-arm/usr/include/jni.h et vous verrez jint, jboolean etc ne sont que typedefs.

56
Gregory Pakosz

Pour caster un jboolean (qui ne peut contenir que les valeurs JNI_FALSE ou JNI_TRUE) vers un natif bool J'utiliserais quelque chose comme ceci:

(bool)(jboolean == JNI_TRUE)

Si le jboolean ne vient peut-être pas de la JVM, alors testez pour jboolean != JNI_FALSE pourrait être considéré comme plus sûr.

24
Guillaume Bréhier

Même problème - résolu. Dans mon cas, j'utilise openFrameworks, donc je ne sais pas si cela s'applique aux projets non openFrameworks (non testés). Cependant, il apparaît que les deux premiers arguments d'une fonction externe sont toujours "env" et "thiz" et ceux-ci doivent être définis explicitement pour chaque nouvelle fonction externe.

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

Si vous souhaitez simplement l'utiliser dans l'instruction if (..), cela fonctionne pour moi sans conversion:

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

L'intrus est jchar. Il est défini comme unsigned short, et en fonction de vos paramètres de compilation, cela peut ou non être équivalent à wchar_t. Selon votre plate-forme sous-jacente, il est préférable de travailler avec des chaînes UTF8. Au moins, ceux-ci sont équivalents au niveau du bit à ASCII pour le sous-ensemble ASCII de caractères).

Sous Windows et Mac OS/Cocoa, cependant, la représentation de chaîne large native est exactement unsigned short. Java s'intègrent naturellement à cela.

1
Seva Alekseyev