jni - referenciados - tipos de datos primitivos en programacion
Convertir tipos JNI a tipos nativos (6)
Si bien hay documentación sobre jstring convertir un jstring en una cadena nativa ( string nativeString = env->GetStringUTFChars(jStringVariable, NULL); ) No puedo encontrar un ejemplo que convierta un jboolean en un bool o un jint en un int .
¿Alguien puede sugerir cómo se logra esto?
El extraño es jchar . Se define como unsigned short y, según la configuración de su compilación, puede o no ser equivalente a wchar_t . Dependiendo de su plataforma subyacente, es mejor que trabaje con cadenas UTF8. Al menos, son equivalentes a nivel de bit a ASCII para el subconjunto de caracteres ASCII.
En Windows y Mac OS / Cocoa, sin embargo, la representación de cadena amplia nativa es exactamente unsigned short . Las cuerdas de Java encajan naturalmente en eso.
Mismo problema – arreglado. En mi caso, estoy usando openFrameworks, así que no sé si esto se aplica a proyectos que no son openFrameworks (no se han probado). Sin embargo, parece que los dos primeros argumentos en una función externa son siempre "env" y "thiz" y estos deben definirse explícitamente para cada nueva función externa.
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 );
}
}
Para lanzar un jboolean (que solo puede contener los valores JNI_FALSE o JNI_TRUE ) a un bool nativo, usaría algo como esto:
(bool)(jboolean == JNI_TRUE)
Si quizás el jboolean no proviene de la JVM, entonces la prueba de jboolean != JNI_FALSE podría considerarse más segura.
Si solo quieres usarlo en la sentencia if (..), esto funciona para mí sin conversión:
if (jboolean == true) {
return true;
} else {
return false;
}
Solo necesitas lanzar jint to int usando modelos de estilo C. Lo mismo para jboolean a bool (si está utilizando el tipo bool C99) o para uint8_t (si está usando los tipos std int) o para los caracteres unsigned char .
Abra $NDK_ROOT/platforms/android-8/arch-arm/usr/include/jni.h y verá que jint , jboolean , etc. son simplemente typedef s.
http://download.oracle.com/javase/1.5.0/docs/guide/jni/spec/types.html#wp9502
Eso responderá a tu pregunta.