使用 JNI 获取类中所有字段的列表

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

我正在为游戏编写 JNI 代码,并且尝试获取特定类的所有字段。这是我的代码。它在第 5 行崩溃,我称之为

CallObjectMethod
classes
是一个无序映射,将
std::string
映射到
jclass

void getAllFields(std::string className) {
    jclass klass = getClass(className);
    if (klass == NULL) return;
    jmethodID getFields = env->GetMethodID(klass, "getFields", "()[Ljava/lang/reflect/Field;");
    jobjectArray fieldsList = (jobjectArray) env->CallObjectMethod(klass, getFields); // error on this line
    jsize len = env->GetArrayLength(fieldsList);
        
    for (jsize i = 0; i < len; i++) {
        jobject field = env->GetObjectArrayElement(fieldsList, i);
        jclass fieldClass = env->GetObjectClass(field);
        jmethodID getName = env->GetMethodID(fieldClass, "getName", "()Ljava/lang/String;");
        jstring fieldName = (jstring) env->CallObjectMethod(field, getName);
        const char *cFieldName = env->GetStringUTFChars(fieldName, 0);
            
        std::cout << cFieldName << std::endl;
        env->ReleaseStringUTFChars(fieldName, cFieldName);
    }
}
    
jclass getClass(std::string className) {
    if (classes.contains(className))
        return classes.at(className);
    return NULL;
}
java c++ java-native-interface
1个回答
0
投票

您需要从元类而不是类中获取

getFields
方法。

更改

getFields
的行,如下所示:

jmethodID getFields = env->GetMethodID(env->GetObjectClass(klass), "getFields", "()[Ljava/lang/reflect/Field;");

在 JNI 中,在同一个对象上调用

GetMethodID
是一个错误,就像你所做的那样
CallXXXMethod

© www.soinside.com 2019 - 2024. All rights reserved.