Chargement de dll à moitié réussi

Chargement de dll à moitié réussi - Java - Programmation

Marsh Posté le 22-10-2003 à 17:41:55    

Bonjour...
 
j'ai un problème qui me rend fou :pt1cable:  
 
j'ai crée 2 classes JNI :
 

Code :
  1. public class JNILettreRecognizer implements RecognizerInterface {
  2. static {
  3.  System.loadLibrary("RECOCarLet" );
  4. }
  5. public native boolean init(String serialKey);
  6. public native String getRecoVersion();
  7. public native String[] recognize(int npoints, int[] xpoints, int[] ypoints, int[] pression);


 

Code :
  1. public class JNIChiffreRecognizer implements RecognizerInterface {
  2. static {
  3.  System.loadLibrary("RECOCarChi" );
  4. }
  5. public native boolean init(String serialKey);
  6. public native String getRecoVersion();
  7. public native String[] recognize(int npoints, int[] xpoints, int[] ypoints, int[] pression);


 
à côté j'ai généré 2 dll associées, quasi vides... il y a juste les fichiers générés par JNI dedans... ensuite je teste le bousin :
 

Code :
  1. String text = "<html>";
  2.     int[] xpoints = new int[2];
  3.     int[] ypoints = new int[2];
  4.     int npoints = 2;
  5.     for (int i = 0; i < npoints; i++) {
  6.      xpoints[i] = i;
  7.      ypoints[i] = i;
  8.     }
  9.     Vector bidon = new Vector();
  10.     String[] retour = null;
  11.     RecognizerInterface chiffre = new JNIChiffreRecognizer();
  12.     text += "<b>Version de RECO Chiffre : </b>";
  13.     text += chiffre.getRecoVersion();
  14.     text += "<br>";
  15.     text += "<b>Retour de RECO Chiffre : </b>";
  16.     retour = chiffre.recognize(bidon);
  17.     for (int i = 0; i < retour.length; i++) {
  18.      text += retour[i] + ", ";
  19.     }
  20.     text = text.substring(0, text.length() - 2);
  21.     text += "<br>";
  22.     RecognizerInterface lettre = new JNILettreRecognizer();
  23.     text += "<b>Version de RECO Lettre : </b>";
  24.     text += lettre.getRecoVersion();
  25.     text += "<br>";
  26.     text += "<b>Retour de RECO Lettre : </b>";
  27.     retour = lettre.recognize(bidon);
  28.     for (int i = 0; i < retour.length; i++) {
  29.      text += retour[i] + ", ";
  30.     }
  31.     text = text.substring(0, text.length() - 2);
  32.     text += "<br>";
  33.     text += "<br>";
  34.     text += "</html>";
  35.     JOptionPane.showMessageDialog(
  36.      this,
  37.      text);


 
le truc, c'est qu'il me balance l'erreur :
 

Code :
  1. java.lang.UnsatisfiedLinkError: no RECOCarLet in java.library.path
  2. at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1403)
  3. at java.lang.Runtime.loadLibrary0(Runtime.java:788)
  4. at java.lang.System.loadLibrary(System.java:832)
  5. at stylo.JNILettreRecognizer.<clinit>(JNILettreRecognizer.java:20)
  6. ...


 
les dll sont identiques au niveau du code.
les 2 dll sont bien dans le jar de l'applet.
l'applet est bien signée.
l'utilisation seule de RECOCarChi marche.
l'ordre de System.loadLibrary ne change rien.
si je charge RECOCarLet dans JNIChiffreRecognizer et RECOCarChi dans JNILettreRcognizer, il plante toujours sur la même librairie...
je ne vois vraiment pas d'où ça peut venir :sweat:  
vous avez une idée ?
 
merci :bounce:


Message édité par Predicator le 22-10-2003 à 17:45:50
Reply

Marsh Posté le 22-10-2003 à 17:41:55   

Reply

Marsh Posté le 22-10-2003 à 17:50:44    

j'ai trouvé... il ne cherche pas la dll dans le .jar, mais dans un répertoire... :cry:  
 
désolé du dérangement :hello:  
 
PS : est-ce possible de dire à la JVM de charger la dll dans le .jar de l'applet ?

Reply

Marsh Posté le 22-10-2003 à 17:52:58    

Essaie de mettre le jar dans le java.library.path sinon je sais pas :/


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 22-10-2003 à 17:56:58    

Taiche a écrit :

Essaie de mettre le jar dans le java.library.path sinon je sais pas :/


 
sauf que le jar est chargé au chargement de l'applet... à priori on sait pas où il est stocké. y'a une méthode pour le savoir ?

Reply

Marsh Posté le 23-10-2003 à 22:08:09    

une applet qui fait du jni ?
 
:pet1cable:

Reply

Marsh Posté le 24-10-2003 à 09:32:36    

oui :o  
on doit développer un système client/serveur sur internet, et mon prédécesseur n'a rien trouvé de mieux que d'utiliser les sessions HTTP 1.1 pour se faciliter la tâche :pfff:  
ce qui fait que maintenant on est obligé de faire tourner en applet dans un navigateur [:spamafote]  
 
si tu as une solution pour me débarrasser rapidement des sessions, je suis preneur, mais bon j'y crois pas trop :sarcastic:

Reply

Marsh Posté le 24-10-2003 à 10:30:56    

Predicator a écrit :

on doit développer un système client/serveur sur internet, et mon prédécesseur n'a rien trouvé de mieux que d'utiliser les sessions HTTP 1.1 pour se faciliter la tâche :pfff:  
ce qui fait que maintenant on est obligé de faire tourner en applet dans un navigateur [:spamafote]  


 
bin tu peux faire de l'HTTP dans un client standalone hein [:dawa]


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 24-10-2003 à 10:35:44    

Ouais, parce que, du JNI dans une applet, à mon avis, ça serait un p'tit peu limite niveau sécurité (euphémisme).

Reply

Marsh Posté le 24-10-2003 à 10:44:50    

El_gringo a écrit :

Ouais, parce que, du JNI dans une applet, à mon avis, ça serait un p'tit peu limite niveau sécurité (euphémisme).


 
certes... l'applet sur le net ne se sert pas des JNI.
l'idéal serait de pouvoir me débarrasser des sessions comme dit Dark_Lord... le problème c'est que j'ai très peu de temps pour le faire, donc si c'est long, faudra laisser tomber.
 
vous avez un truc (hors tuto java, bien fait mais trop lent) qui explique comment émuler les sessions en Java ?
 
sinon le JNI est utilisé par l'applet là où on aurait voulu en faire une application. c'est devenu une applet signée avec des dll embarquées.

Reply

Marsh Posté le 24-10-2003 à 10:48:06    

putain mais qu'est-ce que c'est con d'utiliser HTTP pour du client serveur de base :fou:
tu mettras 3 claques a ton prédécésseur de ma part.
 
y'a des outils pour faciliter ca, c'est pas pour les chiens
[:sisicaivrai]

Reply

Marsh Posté le 24-10-2003 à 10:48:06   

Reply

Marsh Posté le 24-10-2003 à 11:08:18    

lorill a écrit :

putain mais qu'est-ce que c'est con d'utiliser HTTP pour du client serveur de base :fou:
tu mettras 3 claques a ton prédécésseur de ma part.


 
si je l'avais sous la main je l'aurais déjà fait :fou:  
 
[citation]y'a des outils pour faciliter ca, c'est pas pour les chiens
[:sisicaivrai]
[/citation]
comme ?

Reply

Marsh Posté le 24-10-2003 à 11:10:25    

Heu si non j'ai du code pour charger une bibliothéque dynamqiue à partir d'un jar si tu veux.


---------------
Le Tyran
Reply

Marsh Posté le 24-10-2003 à 11:11:23    


http://lucane.org  :whistle:  
 
 
(bon, y'en a surement d'autres, mais je connais pas trop en fait. une recherche sur client server platform/tool devrait aider, sauf que dans ton cas précis t'es un peu bloqué)

Reply

Marsh Posté le 24-10-2003 à 11:11:45    

LetoII a écrit :

Heu si non j'ai du code pour charger une bibliothéque dynamqiue à partir d'un jar si tu veux.


chuis preneur [:cupra]

Reply

Marsh Posté le 24-10-2003 à 11:15:23    

LetoII a écrit :

Heu si non j'ai du code pour charger une bibliothéque dynamqiue à partir d'un jar si tu veux.


 
Un code écrit en Java qui est capable de faire ça ?
J'suis preneur aussi!

Reply

Marsh Posté le 24-10-2003 à 11:17:29    

El_gringo a écrit :


 
Un code écrit en Java qui est capable de faire ça ?
J'suis preneur aussi!


 
idem :hello:

Reply

Marsh Posté le 24-10-2003 à 11:18:38    

lorill a écrit :


chuis preneur [:cupra]


 

Code :
  1. String libraryName = System.mapLibraryName(NativeLibraryBaseName);
  2.         //Récupération du nom de la bibliothéque.
  3.         URL libraryURL = ClassLoader.getSystemResource(libraryName);
  4.         //Récupération du chemin de la bibliothéque.
  5.         try
  6.         {
  7.             if (libraryURL == null)
  8.             {
  9.                 System.loadLibrary(NativeLibraryBaseName);
  10.                 //Essai de chargement direct de la bibliothéque.
  11.             }
  12.             else
  13.             {
  14.                 File test;
  15.                 try
  16.                 {
  17.                     test = new File(new URI(libraryURL.toExternalForm())).getCanonicalFile();
  18.                 }
  19.                 catch (Throwable e1)
  20.                 {
  21.                     test = new File("" );
  22.                 }
  23.                 if (test.exists())
  24.                 {
  25.                     System.load(test.getAbsolutePath());
  26.                 }
  27.                 else
  28.                 {
  29.                     //Extraction de la bibliothèque.
  30.                     File tempLibrary = File.createTempFile(libraryName, "" );
  31.                     tempLibrary.deleteOnExit();
  32.                     tempLibrary = new File(tempLibrary.getParentFile(), libraryName);
  33.                     if (!tempLibrary.exists())
  34.                     {
  35.                         tempLibrary.createNewFile();
  36.                         OutputStream output = new FileOutputStream(tempLibrary);
  37.                         InputStream input = libraryURL.openStream();
  38.                         byte[] buffer = new byte[1024];
  39.                         int length = input.read(buffer);
  40.                         while (length >= 0)
  41.                         {
  42.                             output.write(buffer, 0, length);
  43.                             length = input.read(buffer);
  44.                         }
  45.                         input.close();
  46.                         output.close();
  47.                         tempLibrary.deleteOnExit();
  48.                         //Chargement de la bibliothèque.
  49.                     }
  50.                     System.load(tempLibrary.getPath());
  51.                 }
  52.             }
  53.         }
  54.         catch (IOException e)
  55.         {
  56.             e.printStackTrace();
  57.             throw new UnsatisfiedLinkError(e.getLocalizedMessage());
  58.         }
  59.         catch (UnsatisfiedLinkError e)
  60.         {
  61.             System.err.println("Impossible de charger la bibliothéque dynamique: " + libraryName);
  62.             throw new Error(e);
  63.         }


 
Voilà, en théorie ça passe quelque soit la plateforme, mais j'ai pu tester ça que sous windows. Il faut que le jar soit dans le classpath bien sûr ;)


Message édité par LetoII le 24-10-2003 à 11:19:52

---------------
Le Tyran
Reply

Marsh Posté le 24-10-2003 à 11:21:19    

LetoII a écrit :

Il faut que le jar soit dans le classpath bien sûr ;)


 
mais ça change tout ça :lol:

Reply

Marsh Posté le 24-10-2003 à 11:21:42    

c'est de toi ? on peut le reprendre tel quel ?

Reply

Marsh Posté le 24-10-2003 à 11:22:29    

Predicator a écrit :


mais ça change tout ça :lol:


ca c'est pas un probleme hein... tu précises le classpath de ton applet via la balise, ou alors direct dans le premier jar de l'applet avec le manifest.

Reply

Marsh Posté le 24-10-2003 à 11:22:33    

Predicator a écrit :


 
mais ça change tout ça :lol:


 
Ben pas vraiment, si tu déploie ton truc dans un jar t'as juste à coller la biblio dans le jar avec le reste des classes (c ce que je fais)


---------------
Le Tyran
Reply

Marsh Posté le 24-10-2003 à 11:23:43    

lorill a écrit :

c'est de toi ? on peut le reprendre tel quel ?


 
Ouai tu peux, t'as juste une variable statique à définir et à coller ça ou tu veux dans la classe qui a besoin de la biblio


Message édité par LetoII le 24-10-2003 à 11:24:10

---------------
Le Tyran
Reply

Marsh Posté le 24-10-2003 à 11:29:16    

lorill a écrit :


ca c'est pas un probleme hein... tu précises le classpath de ton applet via la balise, ou alors direct dans le premier jar de l'applet avec le manifest.


 
 :??:  
 
alors c'est moi qui doit être ignard :)  
éclirez ma lanterne svp... quand on charge une applet dans un .jar, on peut dire où cette archives doit être mise ? :heink:

Reply

Marsh Posté le 24-10-2003 à 11:30:53    

Predicator a écrit :


quand on charge une applet dans un .jar, on peut dire où cette archives doit être mise ? :heink:  


non, mais ca utilise le classloader du navigateur (enfin du plugin java), donc ca n'a rien a voir avec la variable d'environnement.

Reply

Marsh Posté le 24-10-2003 à 11:37:10    

Predicator a écrit :


 
 :??:  
 
alors c'est moi qui doit être ignard :)  
éclirez ma lanterne svp... quand on charge une applet dans un .jar, on peut dire où cette archives doit être mise ? :heink:  


 
:sweat:


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 24-10-2003 à 11:41:57    

Predicator a écrit :


 
 :??:  
 
alors c'est moi qui doit être ignard :)  
éclirez ma lanterne svp... quand on charge une applet dans un .jar, on peut dire où cette archives doit être mise ? :heink:  


 
Quand tu utilise un jar le class path est le fichier jar lui même. D'ailleur c assez con par ce que java -jar le_jar -cp le_chemin il s'en fou comme de l'an 40 du chemin rajouté au class path  [:ddr555]


Message édité par LetoII le 24-10-2003 à 11:42:09

---------------
Le Tyran
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed