2011-11-04 28 views
15

¿Cómo convierto un int sin firmar en jint? ¿Debo convertirlo o puedo devolverlo sin ningún tratamiento especial? Este es básicamente mi código en este momento, pero no puedo probarlo, ya que no configuré JNI localmente.JNI: conversión de unsigned int a jint

JNIEXPORT jint JNICALL 
Java_test_test(JNIEnv* env, jobject obj, jlong ptr) 
{ 
    MyObject* m = (MyObject*) ptr; 
    unsigned int i = m->get(); 
    return i; 
} 

Respuesta

16

En el caso general, jint es equivalente a int, y así puede contener aproximadamente la mitad de los valores de unsigned int. La conversión funcionará en silencio, pero si un valor jint es negativo o si un valor unsigned int es mayor que el valor máximo que puede contener jint, el resultado no será el esperado.

+0

Estoy almacenando solo números pequeños, que nunca superarán los límites de un jint, por lo que debería estar bien. – Pedro

+0

¿Alguna vez pueden ser negativos? –

+0

@Jonathan Una vez que el valor alcanza la mitad de la capacidad de un int sin firmar, dará un int negativo debido a la forma en que se implementan los tipos; los valores pequeños están bien – Will03uk

6

jint es un typedef para int32_t se aplican por lo que todas las reglas habituales de fundición.

7

Dependiendo de la configuración del compilador, puede haber o no una advertencia sobre la mezcla de enteros con y sin signo. No habrá error Todas las advertencias de las respuestas anteriores se aplican: unsigned int valores de 0x80000000 (2,147,483,648) y superiores terminarán como números enteros negativos en el lado de Java.

Si es imperativo que los grandes números se conservan en Java, utilice un jlong como un tipo de retorno en su lugar, y convertir así:

return (jlong)(unsigned long long)i; 

El punto es expandir primero en 64 bits, a continuación, para emitir de distancia sin firma. Hacerlo al revés produciría un número negativo de 64 bits.