## Conversión entre Tipos Java y Tipos Nativos

En está página aprenderemos como referenciar los tipos Java en nuestro método nativo. Se necesitará referenciar a los tipos Java cuando queramos:

- Acceder a los argumentos pasados a un método nativo desde una aplicación Java.
- Crear nuevos objetos Java en nuestro método nativo.
- Hacer que nuestro método nativo devuelva resultados a su llamador.

#### Tipos Primitivos de Java

Nuestros método nativo puede acceder directamente a los tipos primitivos de Java, como booleans, integers, floats, etc., que sean pasados desde programas escritos en lenguaje Java. Por ejemplo, el tipo boolean de Java se convierte en el tipo jboolean en el lenguaje nativo (representado como 8 bits sin signo), mientras que el tipo float de Java se convierte en el tipo jfloat en el lenguaje nativo (representado por 32 bits). La siguiente tabla describe las conversiones entre los tipos primitivos de Java y los tipos nativos.

##### Tipos Primitivos y Nativos Equivalentes

Tipo Java | Tipo Nativo | Tamaño en bits
boolean | jboolean | 8, unsigned
byte | jbyte | 8
char | jchar | 16, unsigned
short | jshort | 16
int | jint | 32
long | jlong | 64
float | jfloat | 32
double | jdouble | 64
void | void | n/a

#### Tipos de Objetos Java

Los Objetos Java se pasan por referencia. Todas las referencias a objetos Java tienen el tipo jobject. Por conveniencia y para reducir los errores de programación, el JNI implementa un conjunto de tipos que conceptualmente son todos "Subtipos" de jobject, de la siguiente forma:

- jobject representa todos los objetos Java.
  - jclass representa objetos del tipo (java.lang.Class).
  - jstring representa Strings Java (java.lang.String).
  - jarray representa arrays Java.
    - jobjectArray representa arrays de objetos.
    - jbooleanArray representa arrays booleanos.
    - jbyteArray representa arrays de bytes.
    - jcharArray representa arrays de char.
    - jshortArray representa arrays de short.
    - jintArray representa arrays de int.
    - jlongArray representa arrays de long.
    - jfloatArray representa arrays de float.
    - jdoubleArray representa arrays de double.
  - jthrowable representa excepciones Java (java.lang.Throwable).

En nuestro ejemplo Prompt.java, el método nativo getLine:

    private native String getLine(String prompt);

toma un String Java como argumento y devuelve un String Java. Su implementación nativa correspondiente tiene el tipo jstring tanto para el argumento como para el valor de retorno:

    JNIEXPORT jstring JNICALL
    Java_Prompt_getLine(JNIEnv *, jobject, jstring);

Como se mencionó anteriormente, jstring corresponde al tipo String de Java. Observa que el segundo argumento de Java_Prompt_getLine, que es una referencia al propio objeto, tiene el tipo jobject.

Ozito