java-native-interfacejnienv

How to obtain the name of a Java class from its corresponding jclass?


I have a jclass and I need to find out the name of the corresponding Java class. There is a well-received answer on SO for a similar question, however, it requires an object that's an instance of this class: https://stackoverflow.com/a/12730789/634821

I don't always have an instance where having the name of a jclass would be very useful, and I find it hard to believe that Java has no way to find a class's name, which is obviously a static property, with only static methods. So, is it doable, and how?


Solution

  • A jclass is a jobject subclass that references a java Class object.

    So, cut the first few lines off the answer you found:

    jclass input = ...; // Class<T>
    jclass cls_Class = env->GetObjectClass(input); // Class<Class>
    
    // Find the getName() method on the class object
    mid = env->GetMethodID(cls_Class, "getName", "()Ljava/lang/String;");
    
    // Call the getName() to get a jstring object back
    jstring strObj = (jstring)env->CallObjectMethod(input, 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);