通过使用反射来查找Java类是否在JNI中是最终的

问题描述 投票:0回答:1

我正在尝试通过反射来查找Java类是否是C ++(jni)中的最终类。因此,在JNI中具有下一个Java方法:

int modifiers = com.package_name.class_name.class.getModifiers();
Modifier.isFinal(mofidiers);

在调用Modifier.isFinal()的反射之前,一切正常,它错误地报告了非最终类实际上是最终的。

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

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

Modifier.isFinal()
java android reflection java-native-interface final
1个回答
1
投票

问题是isFinal是静态方法,所以:

替换为:

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");
    jclass class_app = env->FindClass("com/package_name/Test");
    jmethodID method_getModifiers = env->GetMethodID(class_Class, "getModifiers", "()I");

    jint modifiers = env->CallIntMethod(class_app, method_getModifiers);
    return env->CallBooleanMethod(class_modifier, method_isFinal, modifiers);
} 

通过此:

env->CallBooleanMethod(class_modifier, method_isFinal, modifiers)
© www.soinside.com 2019 - 2024. All rights reserved.