使用反射查找Java类在JNI中是否为final 我试图通过使用反射来发现一个java类是C++的最后一个。因此,在JNI中有下一个Java方法: int modifiers = com.package_name.class_name.class.getModifiers(); Modifier.isFinal(mofidiers);

使用反射查找Java类在JNI中是否为final 我试图通过使用反射来发现一个java类是C++的最后一个。因此,在JNI中有下一个Java方法: int modifiers = com.package_name.class_name.class.getModifiers(); Modifier.isFinal(mofidiers);,java,android,reflection,java-native-interface,final,Java,Android,Reflection,Java Native Interface,Final,在调用反射之前,一切都正常,因为反射错误地报告非final类实际上是final类 我已经验证了Modifiers.getModifiers结果,正如预期的那样,如果不是final,它将正确返回1,如果final返回17。然而,Modifiers.IsFinal()也会为“1”值结果返回True,这是公共的,不是最终的 如果使用Java,则不会发生此问题,仅在Jni中。我不希望直接与数值结果进行比较 jboolean test(JNIEnv* env) { jclass class_Mod

在调用反射之前,一切都正常,因为反射错误地报告非final类实际上是final类

我已经验证了Modifiers.getModifiers结果,正如预期的那样,如果不是final,它将正确返回1,如果final返回17。然而,Modifiers.IsFinal()也会为“1”值结果返回True,这是公共的,不是最终的

如果使用Java,则不会发生此问题,仅在Jni中。我不希望直接与数值结果进行比较

jboolean test(JNIEnv* env)
{
    jclass class_Modifier = env->FindClass("java/lang/reflect/Modifier");
    jmethodID method_isFinal = env->GetStaticMethodID(class_Modifier, "isFinal", "(I)Z");

    jclass class_Class = env->FindClass("java/lang/Class");
    jmethodID method_getModifiers = env->GetMethodID(class_Class, "getModifiers", "()I");

    jclass class_Test = env->FindClass("com/package_name/Test");
    jint modifiers = env->CallIntMethod(class_Test, method_getModifiers);
    return env->CallBooleanMethod(class_Modifier, method_isFinal, modifiers);
} 

问题在于,isFinal是一种静态方法,因此:

替换此项:

env->CallBooleanMethod(class_modifier, method_isFinal, modifiers)
据此:

env->CallStaticBooleanMethod(class_modifier, method_isFinal, modifiers)

问题在于,isFinal是一种静态方法,因此:

替换此项:

env->CallBooleanMethod(class_modifier, method_isFinal, modifiers)
据此:

env->CallStaticBooleanMethod(class_modifier, method_isFinal, modifiers)

我不明白当参数的格式错误时,第二个
FindClass()
调用怎么可能成功。比较上一次通话。我不知道当方法是静态的时,调用
CallBooleanMethod()
怎么可能成功。您需要对调用的每个JNI API函数进行错误检查。我不知道在参数格式错误的情况下,第二次
FindClass()
调用怎么可能成功。比较上一次通话。我不知道当方法是静态的时,调用
CallBooleanMethod()
怎么可能成功。您需要对调用的每个JNIAPI函数进行错误检查。