我正在为游戏编写 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;
}
您需要从元类而不是类中获取
getFields
方法。
更改
getFields
的行,如下所示:
jmethodID getFields = env->GetMethodID(env->GetObjectClass(klass), "getFields", "()[Ljava/lang/reflect/Field;");
在 JNI 中,在同一个对象上调用
GetMethodID
是一个错误,就像你所做的那样 CallXXXMethod
。