2011-06-10 23 views
39

Si bien no existe documentación relativa a convertir una jstring a una cadena nativa (string nativeString = env->GetStringUTFChars(jStringVariable, NULL);) No puedo encontrar un ejemplo que convertirá un jboolean a un bool o una jint a un int.Convertir tipos JNI de tipos nativos

¿Alguien puede sugerir cómo se logra esto?

Respuesta

42

Solo necesita convertir jint en int usando moldes de estilo C. Lo mismo para jboolean a bool (si está usando el tipo C99 bool) o para uint8_t (si está utilizando tipos std int) o unsigned char.

Abrir $NDK_ROOT/platforms/android-8/arch-arm/usr/include/jni.h y verá jint, jboolean etc. son sólo typedef s.

+7

Quiere decir int intValue = (int) jIntValue; ? – Graeme

+1

exactamente, el elenco de estilo C hará el trabajo –

+0

Ah .... Tal vez debería actualizar mi pregunta, entonces ... – Graeme

2
+1

No ayudó en absoluto. Entiendo la equivalencia pero sin una comprensión profunda de C/C++ es difícil de entender si eso significa que puede encasillar. – Graeme

+10

Has tenido una vida afortunada si en tu carrera has logrado trabajar solo con tecnologías que conoces o que tienes un tiempo razonable para asimilar por completo antes de tener que usarlas.:) jboolean es un typedef para un char sin signo. No sé cómo convertir esto como un tipo de datos "bool". (Ver simplemente como un prefacio con un (bool) no funciona, lo que me lleva a hacer esta pregunta). – Graeme

+0

En C, cualquier tipo de datos entero es equivalente a booleano. 0 significa falso, cualquier otra cosa es verdadera. Unsigned char es una especie de entero. JNI define las constantes JNI_FALSE y JNI_TRUE (es igual a 1), por las dudas. –

21

Para lanzar un jboolean (que sólo puede contener los valores JNI_FALSE o JNI_TRUE) a un nativo bool me gustaría utilizar algo como esto:

(bool)(jboolean == JNI_TRUE) 

Si tal vez la jboolean no viene de la JVM, a continuación, las pruebas para jboolean != JNI_FALSE se pueden considerar más seguras.

+6

Eso es un poco limitante. Creo que (bool) (java_rtn! = JNI_FALSE) es mejor porque algunas bibliotecas pueden devolver verdadero como un entero no igual a 1 (y JNI_TRUE == 1). – greg7gkb

+1

@ greg7gkb umm, ¿y? ¿De qué "biblioteca" estás hablando? La JVM debe garantizar que un 'boolean' pasado de Java a C será exactamente 0 o 1. – Alnitak

+0

@Alnitak La mayoría de las funciones de la API de Windows devuelve 0 si hubo un error y CUALQUIER VALOR QUE NO SEA 0 si la función tuvo éxito. Entonces, una función puede tener éxito y devolver un valor, por ejemplo, de 28, y usando el código de esta respuesta, se convertirá en falso. – BloodShura

1

El número impar es jchar. Se define como unsigned short y, dependiendo de su configuración de compilación, puede o no ser equivalente a wchar_t. Dependiendo de su plataforma subyacente, es mejor que trabaje con cadenas UTF8. Al menos, esos son equivalentes a bit a ASCII para el subconjunto de caracteres ASCII.

En Windows y Mac OS/Cocoa, sin embargo, la representación nativa de cadenas anchas es exactamente unsigned short. Las cadenas de Java encajan naturalmente en eso.

1

Si sólo desea utilizarlo en la declaración si (..), esto me está funcionando sin necesidad de conversión:

if (jboolean == true) { 
    return true; 
} else { 
    return false; 
} 
3

fija a emitir el mismo. En mi caso, estoy usando openFrameworks, por lo que no sé si esto se aplica a proyectos que no son de openFrameworks (no se han probado). Sin embargo, parece que los primeros dos argumentos en una función externa son siempre "env" y "thiz" y estos deben definirse explícitamente para cada nueva función extern.

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); 
} 


} 
Cuestiones relacionadas