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.