world nazareno logo hello descargar java jni

java - logo - jni nazareno



UnsatisfiedLinkError: no se pudo encontrar el procedimiento especificado (6)

Estoy escribiendo un código JNI en C ++ para ser llamado desde un applet en Windows XP. Pude ejecutar con éxito el applet y cargar y ejecutar la biblioteca JNI, llegando incluso a llamar funciones en otros archivos DLL. Lo conseguí trabajando configurando la variable de entorno del sistema PATH para incluir el directorio en el que están todas mis DLL.

Entonces, el problema es que agrego otra llamada que usa una nueva DLL externa y, de repente, al cargar la biblioteca, se genera un UnsatisfiedLinkError. El mensaje es: ''No se pudo encontrar el procedimiento especificado''. Esto no parece ser un problema con una DLL dependiente faltante, porque puedo eliminar una DLL dependiente y obtener un mensaje diferente sobre DLL dependiente faltante. De lo que he podido encontrar en línea, parece que este mensaje significa que falta una implementación nativa de la función Java de la DLL, pero es extraño que funcione bien sin este bit de código adicional.

¿Alguien sabe qué podría estar causando esto? ¿Qué tipos de cosas pueden dar un mensaje ''No se pudo encontrar el procedimiento especificado'' para un UnsatisifedLinkError?


Existe la posibilidad de que el archivo DLL se haya creado utilizando C ++ (en lugar de C). a menos que haya tenido cuidado de hacer un extern en el procedimiento, esta es una posible razón.

Intente exportar todas las funciones de la DLL. Si la lista incluye tu función, entonces estás bien.


Por lo general, cuando se vincula a otras bibliotecas, debe vincular al archivo .lib correspondiente. Parece que no hace referencia a todos los archivos lib que necesita. Compruebe lo que no está vinculando y asegúrese de agregar su lib a la lista del vinculador.


Resolví el problema. Esto fue una tontería. El mensaje "No se pudo encontrar el procedimiento especificado" para UnsatisfiedLinkError indica que no se pudo encontrar una función en el dll raíz o en un dll dependiente . La causa más probable de esto en una situación JNI es que la función JNI nativa no se exporta correctamente. Pero esto aparentemente puede ocurrir si se carga una DLL dependiente y esa DLL pierde una función requerida por su principal.

A modo de ejemplo, tenemos una biblioteca llamada input.dll. El orden de búsqueda de DLL es buscar siempre primero en el directorio de la aplicación y en los directorios de PATH. En el pasado, siempre ejecutamos ejecutables desde el mismo directorio que input.dll. Sin embargo, hay otro input.dll en el directorio del sistema de Windows (que está en el medio del orden de búsqueda de DLL). Por lo tanto, al ejecutar esto desde un applet de Java, si incluyo el código descrito anteriormente en el applet, que hace que se cargue input.dll, carga el archivo input.dll desde el directorio del sistema. Debido a que nuestro código está esperando ciertas funciones en input.dll que no están allí (porque es una DLL diferente) la carga falla con un mensaje de error sobre procedimientos faltantes. No porque las funciones JNI se exporten incorrectamente, sino porque se cargó el DLL dependiente incorrecto y no tenía las funciones esperadas en él.


Compila tu código de c ++ en modo de depuración. Luego inserte el DebugBreak (); declaración donde le gustaría comenzar la depuración. Ejecuta el código java. Cuando se encuentre la instrucción DebugBreak (), aparecerá una ventana emergente con un botón de depuración. Haz click en eso. Dev Studio se abrirá con su programa en código máquina. Haga un doble paso con el depurador dos veces y podrá pasar por encima de su código fuente.


Si ha realizado todos los problemas de programación en los manuales y ejemplos de JNI, pero todavía está obteniendo el mismo error de procedimiento faltante, es probable que el problema esté en su variable de ruta. Haz los pasos a continuación y corre de nuevo:

  1. Asegúrese de establecer la variable JAVA_HOME en su carpeta JDK (no JRE porque JRE no contiene el encabezado jni) Ejemplo: En el panel de configuración de variables de entorno defina var: JAVA_HOME val: C: / Archivos de programa / Java / jdk1.7.0_11
  2. agregue % JAVA_HOME% / bin a su variable de ruta

Después de hacer esos pasos, su aplicación puede encontrar el nombre del procedimiento jni y los enlaces a JNI.dll de manera correcta. Por lo tanto, espero que no obtenga este error de procedimiento faltante de nuevo.


¿Creó la nueva DLL externa usando el procedimiento JNI estándar? Es decir, ¿usar javah y demás? Si es así, entonces no estoy seguro de lo que está mal.

De lo contrario, el procedimiento al que intenta llamar no se ha exportado (como lo menciona anjanb). Conozco dos formas de exportar funciones: una lista de exportación separada y marcar funciones específicas con __declspec (dllexport).

No se puede acceder a la variable en C ++ DLL desde una aplicación C tiene un poco más de información sobre el tema de las DLL.