我的代码中有大量的反射查找,所以我想办法进行改进。
这是我 jni setter 方法的示例:
JNIEXPORT jobject JNICALL
Java_org_orman_mapper_Model_fieldSetFloat(JNIEnv * env, jobject obj, jobject model, jstring field_name, jstring field_type, jfloat value, jclass clazz)
{
const char* utf_string_name = (*env)->GetStringUTFChars (env, field_name, 0);
const char* utf_string_type = (*env)->GetStringUTFChars (env, field_type, 0);
jfieldID id = (*env)->GetFieldID(env, clazz, utf_string_name, utf_string_type);
(*env)->SetFloatField(env, model, id, value);
return model;
}
像SetFloatField
这样的调用本质上是否跳过任何Java安全检查?
我没有注意到性能上的任何提升。
GetStringUTFChars
是迄今为止最昂贵的函数。你能在这里缓存jfieldID
吗?如果你想绕过安全检查,可以调用Member.setAccessible(true);
,这样即使你有权限,它也会更快。 - Peter Lawrey