Colección de citas famosas - Slogan de motivación - ¡El problema de usar JNI cuando C llama a Java! urgente. . . . .

¡El problema de usar JNI cuando C llama a Java! urgente. . . . .

M es uno de sus componentes, consulte a continuación para obtener más detalles:

--------------------- -- -----------

El sistema operativo carga jvm a través de java.exe en jdk. El entorno jvm se completa mediante los siguientes 4 pasos

1. Cree el entorno de carga y la configuración de jvm

2. Cargue jvm.dll

3. Inicialice jvm.dll y móntelo en la instancia JNIENV (interfaz de llamada JNI)

4. Llame a la instancia JNIEnv para cargar y procesar la clase.

Cuando ejecutamos y depuramos programas java, solemos mencionar el concepto de jvm. jvm es el entorno en el que se ejecutan los programas java, pero también es una aplicación y proceso de un sistema operativo, por lo que también tiene sus características. Tiene su propio ciclo de vida de ejecución y su propio código y espacio de datos.

En primer lugar, hablemos de jdk. Ya seas un principiante o un experto, un programador j2ee o un programador j2se, jdk siempre. Nos está ayudando a hacer algo. Antes de que entendamos Java, los maestros primero nos proporcionarán el jdk. ¿Qué papel juega en todo el sistema Java? Me sorprende que los genios del diseño de los maestros del sol puedan hacer algo tan completo. El sistema está tan perfectamente estructurado que actúa como un centro de producción y procesamiento en este sistema, genera toda la salida de datos y es el centro de ejecución de todas las instrucciones y estrategias. Proporciona una solución completa para Java, que puede ser desarrollada y respaldada por. Actualmente, todas las aplicaciones y programas del sistema Java, déjenme hablar sobre una pregunta que todos preguntarán: ¿por qué existen cosas como j2me y j2ee? El propósito de estas dos cosas es muy simple. proceso en sus respectivos campos Además de jvm, jdk Además, también hay algunas API principales, API integradas, herramientas de usuario, tecnologías de desarrollo, herramientas de desarrollo y API.

Está bien, tantas tonterías, vamos. Hablemos sobre el tema. JVM está en la parte inferior de todo el JDK y es responsable de la interacción del sistema operativo. Se utiliza para proteger el entorno del sistema operativo y proporcionar un entorno operativo Java completo, por lo que también es una computadora virtual. El sistema operativo carga la JVM a través de java.exe en el JDK. Complete el entorno jvm mediante los siguientes 4 pasos

1. Cree el entorno de carga y la configuración de jvm

2. Cargue jvm.dll

3. Inicialice jvm .dll y vincúlelo a la instancia JNIENV (interfaz de llamada JNI)

4 Llame a la instancia JNIEnv para cargar y procesar la clase.

1. Entorno de carga jvm, el método proporcionado por jvm es el archivo de conexión dinámica del sistema operativo. Dado que es un archivo, es cuestión de cargar la ruta. ¿Cómo encuentra Java esta ruta? Cuando llama a la prueba de Java, el sistema operativo agregará su programa java.exe en la ruta. java.exe determinará la ruta de jvm y la configuración de parámetros relacionados mediante el siguiente proceso. El siguiente análisis se basa en la implementación de Windows.

Primero busque la ruta jre. Java obtiene la ruta absoluta java.exe actual a través de la API GetApplicationHome, c:\j2sdk1.4.2_09\bin\java.exe, luego interceptará la ruta absoluta c: \j2sdk1.4.2_09\, determine si el archivo c:\j2sdk1.4.2_09\bin\java.dll existe. Si existe, utilice c:\j2sdk1.4.2_09\ como ruta jre. determine si c:\j2sdk1 .4.2_09\jre\bin\java.dll existe; de ​​ser así, c:\j2sdk1.4.2_09\jre se utiliza como ruta de jre. Si no existe, llame a GetPublicJREHome para verificar la ruta de HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Runtime Environment\"Current JRE version number"\JavaHome, que es la ruta de jre.

Luego cargue la ruta JRE del archivo jvm.cfg + \lib + \ARCH (arquitectura de CPU) + \jvm.cfgARCH (arquitectura de CPU). El juicio se realiza a través de la función GetArch en java_md.c. función, windows Sólo hay dos situaciones para la plataforma: 'ia64' para WIN64 y 'i386' para otras situaciones. Tome el mío como ejemplo: C:\j2sdk1.4.2_09\jre\lib\i386\jvm.cfg El contenido principal es el siguiente:

-cliente CONOCIDO

-servidor. CONOCIDO

-hotspot ALIASED_TO -cliente

-ADVERTENCIA clásica

-ERROR nativo

-ERROR verde

En nuestro, tanto jre\bin\server como jre\bin\client tienen archivos jvm.dll en el directorio jdk, y Java administra estas diferentes versiones de jvm.dll a través del archivo de configuración jvm.cfg. A través del archivo, podemos definir qué jvm es compatible actualmente con jdk. La primera parte (cliente) es el nombre del jvm, seguido de los parámetros KNOWN significa que el jvm existe, ALIASED_TO significa dar un alias a otro jvm. WARN significa encontrar un reemplazo de jvm si no existe. ERROR significa que no se lanzó ninguna excepción. Al ejecutar java Los métodos se especifican directamente y los métodos que ejecutan son "java -J", "java -XXaltjvm=" o "java -J-XXaltjvm=". Si es el primer método de paso de parámetros, la función CheckJvmType tomará el nombre de jvm después del parámetro '-J' y luego lo buscará en los parámetros de configuración de jvm conocidos. Si encuentra el mismo nombre, elimine el '-' antes de. nombre de jvm y lo devolverá directamente. valor y el segundo método devolverá directamente el nombre del tipo de jvm después de "-XXaltjvm=" o "-J-XXaltjvm=" si no se especifica ninguno de los dos métodos anteriores al ejecutar java, CheckJvmType; Tomará el nombre de jvm en la primera configuración del archivo de configuración, eliminará el '-' delante del nombre y devolverá el valor.

El valor de retorno de la función CheckJvmType se combinará con la ruta jre en la siguiente función para formar la ruta absoluta de jvm.dll. Si no se especifica, utilizará el primer jvm definido en jvm.cfg. Puede probarlo en la consola configurando _JAVA_LAUNCHER_DEBUG=1.

Finalmente obtenga la ruta de jvm.dll. Ruta JRE + \bin + cadena de tipo \jvm + \jvm.dll es la ruta del archivo de jvm. Sin embargo, si usa el parámetro -XXaltjvm= al llamar. el programa java, especifíquelo. Para la ruta, simplemente use el archivo path+\jvm.dll directamente como la ruta del archivo jvm.dll.

Dos: cargar jvm.dll

La ruta a jvm se encontró en el primer paso y Java carga el archivo jvm.dll a través de LoadJavaVM. El trabajo de carga es muy simple, simplemente llame a la función API de Windows:

LoadLibrary carga la biblioteca de enlaces dinámicos jvm.dll. Luego conecte las funciones exportadas JNI_CreateJavaVM y JNI_GetDefaultJavaVMInitArgs en jvm.dll a las variables de puntero de función CreateJavaVM y GetDefaultJavaVMInitArgs de la variable InvocationFunctions. La carga de jvm.dll se declara completa.

Tres: Inicialice el jvm y obtenga la interfaz de llamada local, para que pueda llamar a las funciones de jvm en java. Llame a InvocationFunctions->CreateJavaVM, que es el método JNI_CreateJavaVM en jvm para obtener una instancia de la estructura JNIEnv.

Cuatro: Ejecutar el programa java.

Hay dos formas de programar en Java, una es el paquete jar y la otra es la clase. Ejecute jar, java -jar XXX.jar Cuando se ejecuta, java.exe llama a la función GetMainClassName, que primero obtiene el JNIEnv. instancia Luego llame al método getManifest() en la clase java java.util.jar.JarFileJNIEnv y obtenga el valor de getAttributes("Main-Class") del objeto Manifest devuelto, que es el archivo en el paquete jar: Main especificado por META-INF/MANIFEST.MF El nombre de clase principal de -Class se utiliza como clase principal a ejecutar. La función principal luego llamará al método LoadClass en java.c para cargar la clase principal (usando FindClass de la instancia JNIEnv). La función principal llama directamente al método LoadClass en java.c para cargar la clase. Si se ejecuta el método de clase. La función principal llama directamente al método LoadClass en java.c para cargar la clase.

Luego, la función principal llama al método GetStaticMethodID de la instancia JNIEnv para encontrar el método "public static void main(String[] args)" en la clase principal cargada y determina si el método es un método público. y luego llame al método

CallStaticVoidMethod de la instancia JNIEnv para llamar al método principal de la clase java.

Además, la compra de productos del grupo de máquinas virtuales es súper barata