Red de conocimiento informático - Material del sitio web - Al implementar un programa de red JAVA en MyEclipse e iniciar Tomcat, aparece el siguiente mensaje.

Al implementar un programa de red JAVA en MyEclipse e iniciar Tomcat, aparece el siguiente mensaje.

Al ejecutar la página JSP Reporter, aparece un mensaje de error como java.lang.UnsatisfiedLinkError: UnsatisfiedLinkError: no MRChkLib in java.library.path, Error al cargar la biblioteca MRChkLib

, entonces esto se debe a que MRChkLib.dll tiene no se ha copiado en el directorio System32 de Windows. (MRChkLib.dll es el archivo de interfaz JAVA del dongle, que se puede encontrar en el directorio de instalación del informe DogDriver/JavaAPI) y tenga en cuenta que la variable de entorno PATH contiene el directorio System32. (Si el sistema operativo del servidor es Linux, use el archivo libMRChkLib.so en el directorio de instalación del informe DogDriver/JavaAPI y copie libMRChkLib.so en el directorio bin de inicio del servidor web. Si el error de que la biblioteca no se puede cargar aún ocurre en este directorio , establezca el valor de la variable de entorno del sistema LD_LIBRARY_PATH en el directorio donde se encuentra libMRChkLib.so.

Por ejemplo, si libMRChkLib.so se encuentra en el directorio /somedir, exporte LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/. somedir)

b: Si el mensaje de la consola es algo así como

java.lang.unsatisfiedLinkError: libery nativo c:/winnt/system32/mrchklib.dll se ha cargado en otro cargador de clases. error al cargar mrchklib.dll

Este mensaje de error se produce porque la biblioteca de vínculos dinámicos no se puede cargar nuevamente después de reiniciar WebAPP. Esta es una limitación de Java que no permite que una instancia cargue la biblioteca de vínculos dinámicos. varias veces. La solución es copiar mr.jar al directorio lib del servidor web, eliminar mr.jar en el directorio /WEB-INF/lib y luego reiniciar el servidor web.

2. Si hay varias aplicaciones de informes en el servidor web, mueva /WEB-INF/lib/mr.jar al directorio lib del servidor web. Mueva el jar al directorio lib de WebServer, asegúrese de que no haya mr.jar en cada directorio de aplicaciones web y que solo exista el archivo en el directorio lib de WebServer, y luego reinicie el servidor web.

3. Sólo puede haber un archivo mr.jar en el servidor web. Solo puede haber un archivo mr.jar en un servidor web. Elimine los archivos mr*.jar redundantes, luego borre los archivos temporales del servidor web y reinicie el servidor web.

============================================ === =========================================

Proyectos recientes Cuando llegué a jni, instalé eclipse cdt y MinGW para usarlos. Nunca antes había aprendido el lenguaje C. Había tutoriales en Internet y fue fácil de descargar. Al final tuve un gran problema al llamar a métodos locales. Siempre dice que no se puede encontrar el método. Incluso una simple excepción HelloWorld

en el hilo "principal" java.lang.UnsatisfiedLinkError: HelloWorld.print()V

Extraño, loadLibrary() no tiene ningún problema. ¿Por qué no puedo encontrar este método? Exporte el visor a través de dll. El método de exportación es

Desplazamiento de dirección de nombre de función

Java_HelloWorld_print@8 0x67741250 0x00001250

Realmente no tuve más remedio que instalar un enorme. ¡Se volvió a compilar Visual Studio y la llamada fue exitosa! ¡La llamada fue exitosa!

Utilice el visor de exportación de DLL nuevamente y descubra que hay un guión bajo delante del nombre de la función

Desplazamiento de dirección del nombre de la función

_Java_HelloWorld_print@8 0x67741250 0x00001250

Parece que a MinGW le falta un parámetro.

Después de buscar en línea, finalmente encontré la solución: simplemente especifique un parámetro --kill-at en el comando ld de MinGW

gcc -Wl, --kill-at -shared -o jnihello .dll HelloWorld.c

Usando nuevamente el visor de exportación dll, veo que el nombre de la función exportada se convierte en

Nombre de la función Dirección Desplazamiento

Java_HelloWorld_print 0x67741250 0x00001250

El comando --kill-at elimina @ en el sufijo del nombre de la función y no agrega un guión bajo de prefijo

=================== == ================================================= == ===

Fenómeno: java.lang.UnsatisfiedLinkError: la biblioteca nativa xxx.dll ya está cargada en otro cargador de clases en java.lang.ClassLoader.loadLibrary0(ClassLoader.java: 1551) en java.lang. loadLibrary(ClassLoader.java: 1511) en java.lang.Runtime.loadLibrary0(Runtime.java: 788) en java.lang.System.loadLibrary(System.java: 834 Análisis: cuando lanzamos en modo de inicio en caliente usando una aplicación web usando La tecnología JNI y el paquete jar que llama al método local se implementan de forma independiente en la aplicación, y cuando se actualiza nuestra aplicación web, se generará este error cuando se llame al método local encapsulado en el paquete jar (arriba). es Windows. Si es Linux o Unix, debería ser el error xxx.so) Esto se debe a que el servidor web ya ha cargado el dll cuando carga la aplicación por primera vez. Cuando la aplicación se inicia nuevamente, el dll. se reiniciará, por lo que se produjo un error Solución: Primero, implemente el paquete jar que contiene la llamada JNI en la biblioteca lib común del servidor web y la aplicación web se podrá volver a publicar sin cargar. sin cambios, implemente un oyente en la Web para monitorear si es el primer inicio. Si no es el primer inicio, evite que se cargue el dll contenido en el paquete jar.

============================================ === =============================

Problema de carga de clase: error de enlace insatisfecho

Autor: Simon Burns Fuente: IBM Fecha de compilación: 2007-6-3

UnsatisfiedLinkError

El cargador de clases juega un papel importante al vincular las llamadas locales con sus correspondientes definiciones locales.

La especificación JVM define UnsatisfiedLinkError como:

Esta excepción se produce si la máquina virtual Java no puede encontrar una definición en lenguaje nativo para un método declarado como local.

Cuando se llama a un método nativo, el cargador de clases intenta cargar la biblioteca nativa que define el método. Si no se encuentra la biblioteca, se generará este error.

El Listado 6 muestra un caso de prueba que arroja UnsatisfiedLinkError:

Listado 6.UnsatisfiedLinkError.java

public class UnsatisfiedLinkErrorTest { public native void call_A_Native_Method(); System.loadLibrary("myNativeLibrary"); } public static void main(String[] args) { new UnsatisfiedLinkErrorTest().call_A_Native_Method() } }.}

Este código llama al método nativo call_A_Native_Method( ) , este método se define en la biblioteca local myNativeLibrary. Como la biblioteca no existe, se producirá el siguiente error cuando se ejecute el programa:

No se puede cargar la clase java. java.lang.UnsatisfiedLinkError: se puede encontrar la biblioteca myNativeLibrary (myNativeLibrary.dll) en sun.boot.library.path o java.library.path sun.boot.library.path= D:/sdk/jre/bin java.library.path = D:/sdk/jre/bin ClassLoader$NativeLibrary.load(Método nativo) en java.lang.ClassLoader.loadLibrary0(ClassLoader.java:2147) en java.lang.ClassLoader.loadLibrary0(ClassLoader.java:2147) en java .lang.ClassLoader.loadLibrary0(ClassLoader.java:2147) en java.lang.ClassLoader.loadLibrary0(ClassLoader.java:2147)ClassLoader.loadLibrary(ClassLoader.java:2006) en java.lang.Runtime.loadLibrary0(Runtime.java :824) en java.lang.System.loadLibrary(System.java:908) en UnsatisfiedLinkErrorTest.lt;clinitgt;(UnsatisfiedLinkErrorTest.java:6)

La biblioteca local se carga llamando a System.loadLibrary Método () Se inicia la llamada al método System.loadLibrary() de la clase; en el Listado 6, se llama al cargador de clases para UnsatisfiedLinkErrorTest. Dependiendo del cargador de clases utilizado, se buscan diferentes ubicaciones:

Para las clases cargadas a través del cargador de clases de arranque, se busca sun.boot.library.path.

Para las clases cargadas a través del cargador de clases de extensión, primero se busca java.ext.dirs, luego sun.boot.library.path y finalmente java.library.path.

Para las clases cargadas por el cargador de clases del sistema, primero se busca sun.boot.library.path y luego java.library.path.

En el Listado 6, la clase UnsatisfiedLinkErrorTest es cargada por el cargador de clases del sistema. Para cargar una biblioteca nativa a la que se hace referencia, el cargador de clases primero busca sun.boot.library.path y luego java.library.path. Dado que la biblioteca requerida no existe en ninguna ubicación, el cargador de clases genera un UnsatisfiedLinkageError.

=========== ================================= ===============================

java.lang.UnsatisfiedLinkError Este error generalmente ocurre porque Java La máquina virtual no puede encontrar un método declarado como método local. Según tengo entendido, generalmente creo que esto se debe a una importación incorrecta de dll o de un archivo lib. Algunos archivos que deben importarse estáticamente no causarán problemas (por ejemplo, al importar archivos lib, agregue... delante de...), out.println("El problema de carga"

}

De esta manera puedes determinarlo, o simplemente agregar

static{

System.loadLibrary("vtkRenderingJava");

}

====================================== ===== =========================================

Acerca de java.lang.UnsatisfiedLinkError (JNI)

Objetivo: mover los paquetes java de pbp1.0 y los nativos a GEM, y hacer que GEM funcione en la nueva VM

Antecedentes: GEM( 1) tiene un montón de paquetes java y funciones locales, mientras que pbp1.0 es una máquina virtual y un paquete java básico, por lo que es necesario mover la máquina virtual de pbp1.0 para usar solo su paquete java básico y funciones locales.

Problema: se genera una biblioteca dinámica en la función nativa de GEM y pbp1.0. Después de que el programa pasa System.loadLibrary(), no se puede cargar y se informa java.lang.UnsatisfiedLinkError.

p>

Proceso de solución:

1. Teoría

Sabemos que cuando JAVA llama a una función nativa, la biblioteca dinámica donde se encuentra la función nativa debe cargarse en el virtual biblioteca a través de System.loadLibrary() o System.load En la máquina. Y especifique -Djava.library.path o -Dsun.boot.library.path en tiempo de ejecución para señalar la ubicación de la biblioteca dinámica que contiene las funciones nativas.

2. Ejecución

Después de seguir este paso, no pude cargar la biblioteca dinámica libgem.so que generé. Otras bibliotecas dinámicas utilizadas por esta biblioteca incluyen: rt, pthread, freetype. , dl, directfb y las bibliotecas dinámicas utilizadas por directfb incluyen rt, dl, pthread, freetype, jl y directfb. Las bibliotecas Freetype, jpeg y png están todas en el directorio /lib excepto las generadas por directfb.

3. Idea

Primero, escribí un caso de prueba de Hello. Descubrí que cuando uso otras bibliotecas dinámicas localmente, independientemente de si existen en el directorio correspondiente, todavía no se cargan. Luego modifiqué las opciones de compilación y vinculé dinámicamente la biblioteca de vínculos dinámicos utilizada a la biblioteca de destino, de la siguiente manera:

$(GCC) -fPIC -shared -o libdirectfb.so ...-lpng -ljpeg - lpthread -lrt -ldl, -lfreetype

Después de esta modificación, se puede cargar directfb.

Esto también significa que se deben encontrar todos los símbolos a los que hace referencia la biblioteca de vínculos dinámicos cargada por System.loadLibrary(). Si no se encuentra, no se cargará. Puede escribir una función principal () vacía para conectar su biblioteca de enlaces dinámicos. Si los símbolos a los que se hace referencia en la biblioteca de enlaces dinámicos no se encuentran en la biblioteca de enlaces dinámicos especificada y no se pueden compilar por sí mismos, entonces la biblioteca de enlaces dinámicos no se compilará. . carga.

4. Resolución de problemas

De acuerdo con esta idea, el Makefile de compilación de libgem.so se modificó en consecuencia y el problema se resolvió. Y agregue el directorio de la biblioteca de enlaces dinámicos a LD_LIBRARY_PATH.

(1) MHP (Multimedia Home Platform), desarrollado por el proyecto DVB, es el primer estándar abierto del mundo para televisión interactiva. Es un entorno basado en Java que define una interfaz común entre las aplicaciones digitales interactivas y los terminales que ejecutan esas aplicaciones. MHP fue diseñado para ejecutarse en la plataforma DVB, pero existen solicitudes para ampliar la interoperabilidad que proporciona a otras plataformas de televisión digital. Esta necesidad dio origen a GEM, o GEM-enabled TV, y también a GEM, o Global Executable MHP, un marco que permite a otras organizaciones definir especificaciones basadas en MHP.

============= =============================== =========================================

Además También puede ser un problema con el dll en sí. Utilice la versión de lanzamiento en lugar de la versión de depuración

====== ===============. ===== ============================================== ===== =

Respecto al error unsatisfiedlinkError que ocurrió al escribir JNI - -

Este error también me deprimió durante mucho tiempo. Lo estoy escribiendo ahora para que todos puedan evitar desvíos. En términos generales, hay dos tipos de errores:

1. enlace insatisfechoError: nombre del dll, que indica que no colocó el dll en la ubicación correcta, generalmente junto con la función local de la clase a llamar. por supuesto La premisa es que generó con éxito el dll

2 y unsatisfiedlinkError: nombre del método. En este momento, en realidad ha generado el dll con éxito.

En este momento, su dll se generó correctamente y la ubicación es correcta. Esto significa que no ha definido esa función. Puede decir que lo definí claramente. De hecho, cuando encuentre el problema, solo puede admitir que sí. Si tiene mala suerte, debe ser que algunas de las letras que definió la función en el archivo C son incorrectas, porque el resto se genera automáticamente y no se producirán errores. Este problema ocurre a menudo, especialmente al copiar programas fuente directamente desde Internet. Algunos autores son irresponsables y publican programas erróneos.