55 votes

Convertir les types JNI en types natifs

Bien qu'il existe une documentation concernant la transformation d'un jstring en une chaîne de caractères native ( string nativeString = env->GetStringUTFChars(jStringVariable, NULL); ) Je n'arrive pas à trouver un exemple qui permette de convertir un fichier de type jboolean à un bool ou un jint à un int .

Quelqu'un peut-il suggérer comment y parvenir ?

66voto

Gregory Pakosz Points 35546

Il vous suffit de lancer jint à int en utilisant des moulages de style C. Idem pour jboolean a bool (si vous utilisez C99 bool ) ou à uint8_t (si vous utilisez les types std int) ou à unsigned char .

Abrir $NDK_ROOT/platforms/android-8/arch-arm/usr/include/jni.h et vous verrez jint , jboolean etc. sont juste typedef s.

30voto

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

(bool)(jboolean == JNI_TRUE)

Si peut-être le jboolean ne provient pas de la JVM, alors le test de l'option jboolean != JNI_FALSE pourrait être considéré comme plus sûr.

3voto

Steven Points 11

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 (je n'ai pas testé). Cependant, il apparaît que les deux premiers arguments d'une fonction externe sont toujours "env" et "thiz" et qu'ils 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 );
}

}

2voto

Seva Alekseyev Points 31812

L'intrus est jchar . Il est défini comme suit unsigned short et, selon les paramètres de votre compilation, cela peut ou non être équivalent à wchar_t . En fonction de votre plate-forme sous-jacente, il est peut-être préférable de travailler avec des chaînes UTF8. Au moins, celles-ci sont équivalentes en termes de bits à ASCII pour le sous-ensemble de caractères ASCII.

Sous Windows et Mac OS/Cocoa, cependant, la représentation native de la chaîne large est exactement la suivante unsigned short . Les chaînes de caractères Java s'inscrivent naturellement dans ce contexte.

1voto

Trey Points 718

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X