Anonymous
Когда мне следует использовать разрешение имен вместо RegisterNatives в JNI?
Сообщение
Anonymous » 11 ноя 2025, 20:17
В System.c функция JVM, соответствующая Java System.currentTimeMillis(), регистрируется с помощью RegisterNatives.
Напротив, System.identityHashCode(Object) вызывает функцию JVM напрямую на основе соглашения об именах.
https://github.com/openjdk/jdk/blob/9b9 ... .c#L39-L59
Код: Выделить всё
/* Only register the performance-critical methods */
static JNINativeMethod methods[] = {
{"currentTimeMillis", "()J", (void *)&JVM_CurrentTimeMillis},
{"nanoTime", "()J", (void *)&JVM_NanoTime},
{"arraycopy", "(" OBJ "I" OBJ "II)V", (void *)&JVM_ArrayCopy},
};
JNIEXPORT void JNICALL
Java_java_lang_System_registerNatives(JNIEnv *env, jclass cls)
{
(*env)->RegisterNatives(env, cls,
methods, sizeof(methods)/sizeof(methods[0]));
}
JNIEXPORT jint JNICALL
Java_java_lang_System_identityHashCode(JNIEnv *env, jobject this, jobject x)
{
return JVM_IHashCode(env, x);
}
Используются оба подхода, но что определяет, какой из них использовать?
Подробнее здесь:
https://stackoverflow.com/questions/797 ... ves-in-jni
1762881426
Anonymous
В System.c функция JVM, соответствующая Java System.currentTimeMillis(), регистрируется с помощью RegisterNatives. Напротив, System.identityHashCode(Object) вызывает функцию JVM напрямую на основе соглашения об именах. https://github.com/openjdk/jdk/blob/9b99bc8ef53ad20c4f1cb5d26cffc64b0deb79ad/src/java.base/share/native/libjava/System.c#L39-L59 [code]/* Only register the performance-critical methods */ static JNINativeMethod methods[] = { {"currentTimeMillis", "()J", (void *)&JVM_CurrentTimeMillis}, {"nanoTime", "()J", (void *)&JVM_NanoTime}, {"arraycopy", "(" OBJ "I" OBJ "II)V", (void *)&JVM_ArrayCopy}, }; JNIEXPORT void JNICALL Java_java_lang_System_registerNatives(JNIEnv *env, jclass cls) { (*env)->RegisterNatives(env, cls, methods, sizeof(methods)/sizeof(methods[0])); } JNIEXPORT jint JNICALL Java_java_lang_System_identityHashCode(JNIEnv *env, jobject this, jobject x) { return JVM_IHashCode(env, x); } [/code] Используются оба подхода, но что определяет, какой из них использовать? Подробнее здесь: [url]https://stackoverflow.com/questions/79788082/when-should-i-use-name-resolution-vs-registernatives-in-jni[/url]