El JNI proporciona un interface sencillo para programadores C++. El fichero jni.h contiene un conjunto de funciones C++ para que el programador del m�todo nativo pueda escribir solo.
jclass cls = env->FindClass("java/lang/String");
en lugar de :
jclass cls = (*env)->FindClass(env, "java/lang/String");
El nivel extra de indirecci�n de env y el argumento env a FindClass est�n ocultos para el programador. El compilador C++ expandir� las llamadas a las funciones miembros de C++, y por lo tanto el c�digo resultante es exactamente el mismo.
El fichero jni.h tambi�n define un conjunto de clases in�tiles de C++ para forzar la relaci�n de tipado entre las diferentes variaciones del tipo jobject.
class _jobject {}; class _jclass : public _jobject {}; class _jthrowable : public _jobject {}; class _jstring : public _jobject {}; ... /* more on jarray */ typedef _jobject *jobject; typedef _jclass *jclass; typedef _jthrowable *jthrowable; typedef _jstring *jstring; ... /* more on jarray */
Por lo tanto, el compilador C++ puede detectar si se le pasa, un jobject a GetMethodID, por ejemplo.
jmethodID GetMethodID(jclass clazz, const char *name, const char *sig);
ya que GetMethodID espera un jclass. En C, jclass es simplemente lo mismo que jobject.
typedef jobject jclass;
Por lo tanto, un compilador C no puede detectar que se le ha pasado err�namente un jobject en vez de un jclass.
La adici�n del tipos seguros en C++ tiene un peque�o inconveniente. Recordemos de Acceder a Arrays Java que en C, podemos crear un String Java desde un array de Strings y directamente asignar el resultado a un jstring.
jstring jstr = (*env)->GetObjectArrayElement(env, arr, i);
Sin embargo, en C++, necesitamos insertar una conversi�n expl�cita.
jstring jstr = (jstring)env->GetObjectArrayElement(arr, i);
porque jstring es un subtipo de jobject, el tipo de retorno de GetObjectArrayElement.