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é?
Il vous suffit de transtyper jint
to 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 typedef
s.
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.
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 );
}
}
Si vous souhaitez simplement l'utiliser dans l'instruction if (..), cela fonctionne pour moi sans conversion:
if (jboolean == true) {
return true;
} else {
return false;
}
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.