|
Réalisation 
|
|
[JNI] Méthode static et native
|
Bonjour,
Comme j'ai besoind de pouvoir redémarrer une machine sous Windows
directement à partir d'une application java, j'ai écrit une petite dll.
J'ai d'abord créé ma classe java :
package tools.windows;
public class WinPowerManagement {
static {
System.loadLibrary("WinPowerManagement");
}
public native static int restartWindows();
}
Puis j'ai créé mon fichier .h à partir de la classe. D'ailleurs, à ce
niveau, j'ai un doute : est-ce qu'il faut faire : javah -jni
tools.windows.WinPowerManagement ou javah -jni WinPowerManagement
directement ? La signature du fichier .h change en conséquence.
Ensuite, j'implémente mon fichier .cpp et je compile ma belle dll, que je
met ds le PATH. Mais ça ne marche pas, j'ai le message suivant quand je
tente de lancer ma méthode (static je le rappelle)
java.lang.UnsatisfiedLinkError: restartWindows
at tools.windows.WinPowerManagement.restartWindows(Native Method)
at ihm.Menu.actionPerformed(Menu.java:128)
at
javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1767)
Quelqu'un à une idée de l'origine du pb ?
Y'a un moyen de savoir pourquoi ça ne marche pas ?
Merci
Damien Lean
 |
 |
Bonjour,
Il faut faire :
> javah -jni tools.windows.WinPowerManagement
qui génère "tools_windows_WinPowerManagement.h"
> Ensuite, j'implémente mon fichier .cpp et je compile ma belle dll, que
> je met ds le PATH.
Quel PATH ? LD_LIBRARY_PATH ?
Met la dans le répertoire de lancement
Là où tu lance : java tools.windows.WinPowerManagement
> java.lang.UnsatisfiedLinkError: restartWindows
Signe qu'il ne trouve pas la dll.
Rémi
 |
 |
> Il faut faire :
> > javah -jni tools.windows.WinPowerManagement
> qui génère "tools_windows_WinPowerManagement.h"
Ok, j'ai bien ça.
> Quel PATH ? LD_LIBRARY_PATH ?
Le PATH de Windows, comme ça il trouve ma dll
> > java.lang.UnsatisfiedLinkError: restartWindows
> Signe qu'il ne trouve pas la dll.
Avant ds le mettre de le PATH de Windows, j'avais un autre message
d'erreur, qui parlait d'un java.library.path
Sans dll :
java.lang.UnsatisfiedLinkError: no WinPowerManagement in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1410)
at java.lang.Runtime.loadLibrary0(Runtime.java:772)
at java.lang.System.loadLibrary(System.java:832)
at tools.windows.WinPowerManagement.<clinit>(WinPowerManagement.java:6)
at ihm.Menu.actionPerformed(Menu.java:128)
Avec la dll ds le PATH :
java.lang.UnsatisfiedLinkError: restartWindows
at tools.windows.WinPowerManagement.restartWindows(Native Method)
at ihm.Menu.actionPerformed(Menu.java:128)
Y'a pas de constructeur dans ma classe, ça pose un pb ?
Ou alors il aime pas les méthodes static peut-être ?
Damien
 |
 |
> > Quel PATH ? LD_LIBRARY_PATH ?
> Le PATH de Windows, comme ça il trouve ma dll
Java étant multiplate-forme, je ne pensais pas que le PATH
de Windows était pris en compte. Mais si c'est le cas tant mieux.
> > > java.lang.UnsatisfiedLinkError: restartWindows
> > Signe qu'il ne trouve pas la dll.
> Avant ds le mettre de le PATH de Windows, j'avais un autre message
> d'erreur,
>
> Sans dll :
> java.lang.UnsatisfiedLinkError: no WinPowerManagement in
> java.library.path at
> java.lang.ClassLoader.loadLibrary(ClassLoader.java:1410)
>
> Avec la dll ds le PATH :
> java.lang.UnsatisfiedLinkError: restartWindows
> at tools.windows.WinPowerManagement.restartWindows(Native Method)
> at ihm.Menu.actionPerformed(Menu.java:128)
Il semble que :
1) la dll est chargée, sinon le ClassLoader lancerait une exception. 2)
la méthode "restartWindows" n'est pas trouvée dans la DLL.
Est-elle bien déclarée native dans le .java ? exportée dans le .c ?
Le tutorial explique les choses plus en détail :
http://java.sun.com/docs/books/tutorial/native1.1/stepbystep/index.html
Rémi
 |
 |
> Le tutorial explique les choses plus en détail :
> http://java.sun.com/docs/books/tutorial/native1.1/stepbystep/index.html
J'ai suivi l'exemple et tout a fonctionné directement.
Donc le pb venait de ma dll.
J'ai reconstruit le projet ds VC++ et tout a fonctionné aussi directement.
Les mystères de compilation sous windows ...
Merci
Damien Lecan