Este código le dará el nombre de la clase llamada:
jclass cls = env->GetObjectClass(obj);
// First get the class object
jmethodID mid = env->GetMethodID(cls, "getClass", "()Ljava/lang/Class;");
jobject clsObj = env->CallObjectMethod(obj, mid);
// Now get the class object's class descriptor
cls = env->GetObjectClass(clsObj);
// Find the getName() method on the class object
mid = env->GetMethodID(cls, "getName", "()Ljava/lang/String;");
// Call the getName() to get a jstring object back
jstring strObj = (jstring)env->CallObjectMethod(clsObj, mid);
// Now get the c string from the java jstring object
const char* str = env->GetStringUTFChars(strObj, NULL);
// Print the class name
printf("\nCalling class is: %s\n", str);
// Release the memory pinned char array
env->ReleaseStringUTFChars(strObj, str);
Tenga en cuenta que no he tomado ninguna acción para comprobar si hay errores. Esto es solo un pequeño fragmento de código que describe cómo se podría hacer.
alternativa usted puede hacer esto en lugar de utilizar el GetStringUTFChars/ReleaseStringUTFChars
:
// Make sure that the buffer is large enough
char str[128];
jint strlen = env->GetStringUTFLength(strObj);
env->GetStringUTFRegion(strObj, 0, strlen, str);
printf("\nCalling class is: %s\n", str);
No hay necesidad de liberar ya que la cadena se copia en memoria intermedia local.
Creo que no debería usar strlen como nombre de variable ya que es una función C estándar existente. –
En mi experiencia, en realidad no necesita los pasos en "Primero obtenga el objeto de la clase"; 'clsObj' y' cls' son funcionalmente equivalentes. – shawkinaw
El código de ejemplo muestra referencias locales con fugas ocultas si se usan "tal cual". Todas las referencias de jobject y jclass deben ser eliminadas. Además, esta es una mala práctica: jclass cls = env-> GetObjectClass (obj); ... cls = env-> GetObjectClass (clsObj); Sin liberar la referencia anterior almacenada en cls. –