Error en llamada a JNI

Javier Mart?
03 de Mayo del 2006
Estoy realizando una aplicacioón para Windows y mi problema en el siguiente error cuando realizo llamadas a una función que está dentro de una dll.
Exception in thread "main" java.lang.UnsatisfiedLinkError: diHola
at HolaMundo.diHola(Native Method)
at HolaMundo.main(HolaMundo.java:12)
He mirado en muchos manuales y todos dicen q hay que poner en el path la ruta donde está la dll. Dicha ruta SI la tengo en el path.

El código que utilizo es el siguiente:
Codigo java
//package prueba.hola;
public class HolaMundo
{
public native void diHola();
static {
System.loadLibrary("HolaMundo"); }

public static void main(String[] args) {
new HolaMundo().diHola(); }
}

Código c
#include <stdio.h>
#include "HolaMundo.h"
JNIEXPORT void JNICALL Java_HolaMunod_diHola(JNIEnv *Entorno, jobject objetos){
printf("Holan");}

Según está el código, si genero el .h y la .dll todo funciona, el error se produce cuando descomento la línea del package.
Utilizo JSDK1.4, Windows2000/XP
¿Es necesaria alguna dll o paquete para poder corregir el error?
Ya llevo más de un mes con este problema y no encuentro ninguna solución.¿Alguien sabe como solucionarlo?

Gracias. Un saludo Javier

daavich
03 de Mayo del 2006
No sé si será un error de tu código o ha ocurrido al copiarlo al foro pero en "JNIEXPORT void JNICALL Java_HolaMunod_diHola(JNIEnv *Entorno, jobject objetos)" estás poniendo HolaMundod en vez de HolaMundo.


Marius
03 de Mayo del 2006
Me paba exactamente lo mismo que a ti. la solucion, ejecutar el javah poniendole la ruta completa del paquete .
Una vez hecho esto recompile la DLL y ya me funciono.
Para paquetes: javah paquete.clase
Sin paquetes javah clase

mytrol
03 de Mayo del 2006
Probablemente tu problema se presenta porque la rutina nativa está en el directorio del paquete, tienes que ajustar la variable de entorno classpath para que la generacion del byecode ("compilación") se suceda sin problemas. Te sugiero que a menos que sea una cantidad importante de clases jerárquicas las que estés utilizando en tu proyecto, no utilices paquetes.
[[Si deseas forzosamente trabajar con empaquetados, y te da flojera establecer las variables de entorno, NetBeans y Eclipse pueden ayudarte a que esto sea más sencillo]]].

Comentario (opcional) .- No sé para que demonios se inventó la Java Native Interface porque la verdad desvirtúa el intento de Sun por hacer de J2SE un entorno y un lenguaje multiplataforma. Ojalá algún día se arregle ese asunto.

Javier Mart?
03 de Mayo del 2006
Gracias por las respuestas. Encontré la solución en la siguiente dirección: http://www.rgagnon.com/howto.html