¿Qué hace el método registerNatives ()?

En java, ¿qué hace el método estático privado registerNatives() de la clase Object?

Las otras respuestas son técnicamente correctas, pero no son muy útiles para alguien sin experiencia en JNI. 🙂

Normalmente, para que la JVM encuentre sus funciones nativas, deben nombrarse de cierta manera. por ejemplo, para java.lang.Object.registerNatives , la función C correspondiente se llama Java_java_lang_Object_registerNatives . Mediante el uso de registerNatives (o más bien, la función JNI RegisterNatives ), puede nombrar sus funciones C lo que quiera.

Aquí está el código C asociado (de OpenJDK 6):

 static JNINativeMethod methods[] = { {"hashCode", "()I", (void *)&JVM_IHashCode}, {"wait", "(J)V", (void *)&JVM_MonitorWait}, {"notify", "()V", (void *)&JVM_MonitorNotify}, {"notifyAll", "()V", (void *)&JVM_MonitorNotifyAll}, {"clone", "()Ljava/lang/Object;", (void *)&JVM_Clone}, }; JNIEXPORT void JNICALL Java_java_lang_Object_registerNatives(JNIEnv *env, jclass cls) { (*env)->RegisterNatives(env, cls, methods, sizeof(methods)/sizeof(methods[0])); } 

(Observe que Object.getClass no está en la lista, sino que seguirá siendo llamado por el nombre “estándar” de Java_java_lang_Object_getClass ). Para las funciones enumeradas, las funciones C asociadas se enumeran en esa tabla, lo que es más útil que escribir un montón de funciones de reenvío.

El registro de funciones nativas también es útil si está incorporando Java en su progtwig C y desea vincular las funciones dentro de la propia aplicación (a diferencia de dentro de una biblioteca compartida), o las funciones que se utilizan no son “exportadas”, ya que normalmente no sería encontrado por el mecanismo de búsqueda de método estándar. El registro de funciones nativas también se puede utilizar para “volver a enlazar” un método nativo a otra función C (útil si su progtwig admite cargar y descargar módulos dinámicamente, por ejemplo).

Animo a todos a leer el libro de JNI , que habla sobre esto y mucho más. 🙂

Lo que podría ser un poco confuso es que el código que se muestra para java.lang.Object.registerNatives en una respuesta anterior es solo un ejemplo de cómo registrar funciones nativas. Este es el código que (en la implementación de OpenJDK) registra funciones nativas para Object de clase. Para registrar funciones nativas para su propia clase, debe llamar a la función JNI RegisterNatives desde el código nativo en su propia biblioteca. Esto puede sonar un poco circular, pero hay un par de maneras de romper el ciclo.

  1. Siga el ejemplo de esta implementación del objeto de clase:

    a. En su clase Java, declare un método nativo (preferiblemente estático) llamado registerNatives (o cualquier otro nombre, no importa).

    segundo. En su código nativo, defina una función llamada Java__registerNatives , que contiene una llamada a la función JNI RegisterNatives .

    do. Asegúrese de que en su código Java, se llame a su método Java registerNatives antes de cualquier llamada a otros métodos nativos.

O

  1. Use JNI_OnLoad

    a. En su biblioteca nativa, defina una función jint JNI_OnLoad(JavaVM *vm, void *reserved) . En el cuerpo de esta función, llame a la función JNI RegisterNatives .

    segundo. Java VM buscará automáticamente y llamará a JNI_OnLoad cuando su biblioteca nativa esté cargada por System.loadLibrary , que ya debería estar llamando, probablemente en un inicializador estático para su clase. (Obtiene el puntero env requerido llamando a la función GetEnv en la tabla a la que apunta el puntero vm ).

Ya que miró el código fuente para encontrarlo, es bastante fácil de adivinar ¿no?

Es un método nativo, y se llama registerNatives, así que supongo que registra objetos con la plataforma subyacente.

También es privado, por lo que probablemente no hay nada de qué preocuparse.