Introducción detallada al proceso de registro de la función Java JNI
Cuando llamamos código nativo en Java, generalmente se implementa a través de JNI. Solo necesitamos cargar el archivo de biblioteca .sO local en la clase Java, declarar el método nativo y luego llamarlo donde debe llamarse. En cuanto a la implementación específica del método nativo en Java, todo se entrega a la capa nativa. ¿Cuál es el requisito previo para nosotros llamar correctamente las funciones correspondientes en el código local en Java? La respuesta es establecer una correspondencia uno a uno entre los métodos nativos en Java y las funciones en el código local a través de ciertos mecanismos. Entonces, ¿qué es este mecanismo? Es el mecanismo de registro de las funciones JNI.
Hay dos formas de registrar las funciones JNI, una es el método de registro estático y el otro es el método de registro dinámico. Presentemos estos dos métodos de implementación a continuación.
1. Registro estático.
1. Principio de implementación: establecer una correspondencia uno a uno entre un método Java y una función JNI basada en el nombre de la función.
2. Proceso de implementación:
① Escritura del código Java;
② Compile el código Java y genere archivos .class;
③ Use la Directiva Javah para generar el archivo JNI .H utilizando el archivo .class generado;
④ El archivo de encabezado JNI generado contiene la declaración de funciones de Java en la capa JNI;
3. Desventajas:
① La escritura es muy inconveniente porque los nombres de las funciones de la capa JNI deben seguir un formato específico y los nombres son particularmente largos;
② Causará mucho trabajo para los programadores, porque los archivos de encabezado JNI deben escribirse para todas las clases de Java que declaran funciones nativas;
③ El programa se está ejecutando ineficiente, porque al llamar a una función nativa por primera vez, debe buscar la función local correspondiente en la capa JNI de acuerdo con el nombre de la función y luego establecer una relación correspondiente. Este proceso lleva mucho tiempo.
2. Registro dinámico.
1. Principio de implementación: le indique directamente a la función nativa su puntero a la función correspondiente en JNI;
2. Proceso de implementación:
① Use la estructura jninativemethod para salvar la correspondencia entre las funciones nativas de Java y las funciones JNI;
② Guardar la correspondencia entre todas las funciones nativas y las funciones JNI en una matriz de Jninativemethod;
③ Después de cargar la biblioteca dinámica JNI a través del sistema.
④ La función AndroidRuntime :: RegisterNativeMethods se llamará en JNI_ONLOAD para el registro de funciones;
⑤El Llamada final a JniregisterNativeMethods en Androidruntime :: Registro de registro de registro completo.
3. Ventajas: superar las desventajas del registro estático.
Gracias por leer, espero que pueda ayudarte. ¡Gracias por su apoyo para este sitio!