IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Applets Java Discussion :

Accès aux librairies locales à partir d'une applet


Sujet :

Applets Java

  1. #21
    Membre chevronné
    Avatar de fxrobin
    Homme Profil pro
    Architecte SI, Java Fan, API Manager
    Inscrit en
    Novembre 2007
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte SI, Java Fan, API Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 875
    Points : 2 112
    Points
    2 112
    Par défaut
    De mémoire, je n'avais pas mis les DLL dans un JAR, mais directement dans le répertoire.

    Ensuite, déclarée dans le lanceur JNLP et s'était tout.
    et le .jar de l'API JNI Wrapper de la DLL, biensûr.


    et en mode "debug" qu'as tu dans la variable "location" et dans ta variable "codeURL" ?
    Moins on code, moins il y a de bug ... et vice-versa ainsi qu'inversement ...

  2. #22
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 32
    Points : 10
    Points
    10
    Par défaut
    Comment as-tu déclaré tes DLLs dans ton lanceur ?
    Parce que c'est ce que j'avais essayé et cela m'indiquer impossible de charger la ressource file:/D:/..../apiJni.dll ...
    Du coup, j'ai cherché comment faire et je suis tombé sur http://docs.oracle.com/javase/1.4.2/...html#resources voir chapitre "resources Element"

    Sinon, pour le location, j'ai "C:\externalJars\...\". En bref, le répertoire que j'ai sur mon serveur et qui est indiqué dans mon lanceur JNLP (<jar href="externaljars/.../apiJni.jar/>)

    Aussi, autre question (je suis en train de chercher mais si tu as la réponse ça me fera gagner du temps) => comment indiqué le log4j.xml utilisé par mon api JNI ?
    (Pour l'instant, j'ai ajouter au lanceur JNLP <property name="log4j.configuration" value="./log4j.xml" /> mais ça ne fonctionne pas mieux)

  3. #23
    Membre chevronné
    Avatar de fxrobin
    Homme Profil pro
    Architecte SI, Java Fan, API Manager
    Inscrit en
    Novembre 2007
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte SI, Java Fan, API Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 875
    Points : 2 112
    Points
    2 112
    Par défaut
    De mémoire, parce que je n'ai plus le projet sous les yeux il me suffisait simplement de faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.loadLibrary("monfichier"); // lecture de "monfichier.dll" : note ne pas mettre .dll
    et comme c'était une ressource du JNLP, pas de soucis.

    tiens, regarde ce lien :
    http://lopica.sourceforge.net/faq.html#native

    et ça aussi :
    http://lopica.sourceforge.net/ref.html#nativelib

    Bon finalement, je ne me souviens plus si je l'avais mis à la racine d'un JAR ou pas ... il me semblait que non ... mais vus les liens que je viens de te donner il faut mettre tes dll dans un JAR.


    Pour log4j.xml ... il ne le voit pas quand il est à la racine du JAR de ton applet ?
    Moins on code, moins il y a de bug ... et vice-versa ainsi qu'inversement ...

  4. #24
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 32
    Points : 10
    Points
    10
    Par défaut
    J'avais vu l'utilisation du System.loadLibrary mais je n'ai pas essayé car, ici, je n'ai pas la main sur l'api et, du coup, je ne peux changer le code en faisant un System.loadLibrary() à la place du code de l'api.
    D'autre part, en admettant que je fasse ce System.loadLibrary() dans mon applet, rien d'empêcher le fait que le code de l'api s'exécute et me renvoie une erreur du fait qu'il va chercher la dll à un certain endroit.

    Je pense à une autre solution =>
    1- dans le lanceur JNLP, j'indique un jar contenant mon jar avec mes 2 DLLs.
    2- dans mon applet, je déjarre ce jar dans le répertoire où se trouve mon jar api
    Qu'en penses-tu ?
    D'ailleurs, y'a peut être une option JNLP permettant de faire cela ??

    Pour le log4j.xml, je l'ai rajouté dans le jar de mon applet ainsi que dans le répertoire possédant le jar => dans les 2 cas, ça ne fonctionne pas (ce qui me paraît vraiment bizarre) => je vais essayer en mettant un log4j.properties, on ne sait jamais

  5. #25
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    a mon avis, avec jnlp, tu devrais te contenter d'un System.load("talibrairie")

  6. #26
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 32
    Points : 10
    Points
    10
    Par défaut
    Sauf que le System.load(libraryName) ne va pas suffir, non ?

    L'api, en exécutant le code suivant va me renvoyer un UnsatisfiedLinkError
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    String libName = System.mapLibraryName("jniApi");
    File libFile = new File(location, libName);
    if(!libFile.isFile())
    throw new UnsatisfiedLinkError("jniApi not found");
    J'ai tort ?

  7. #27
    Membre chevronné
    Avatar de fxrobin
    Homme Profil pro
    Architecte SI, Java Fan, API Manager
    Inscrit en
    Novembre 2007
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte SI, Java Fan, API Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 875
    Points : 2 112
    Points
    2 112
    Par défaut
    oui sûrement, parce que File c'est forcément une ressource locale.
    C'est cette "API" sur laquelle tu n'as pas la main qui risque effectivement de poser problème.

    Tu es obligé de lancer cette portion de code ?
    Si tu charges la DLL avec loadLibrary toi même, est-ce que cela te permet d'utiliser le reste de ton API ?
    Moins on code, moins il y a de bug ... et vice-versa ainsi qu'inversement ...

  8. #28
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 32
    Points : 10
    Points
    10
    Par défaut
    La portion de code est en static dans la classe de mon api malheureusement => donc je suis obligé de passer par là.

    Après je pourrais éventuellement catcher l'exception et continuer mon traitement ??? Ce n'est pas très beau mais je vais tenter le coup ...

  9. #29
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Nope, catcher ne résoudra pas ton problème là. Si c'est un bloc static, l'exception passer par le classloader avant d'arriver à toi et le classloader marque la classe comme inutilisable, et coic.


    Un solution pourave serait d'aller voir quel est le dossier mentionné par le File, et, avant de charger ta librairie, d'y copier la dll dans le répertoire attendu C'est moche et remoche

  10. #30
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 32
    Points : 10
    Points
    10
    Par défaut
    Ah, merci pour cette réponse. Vu que j'avais plusieurs solutions à tester, cela m'en élimine une

    Le fait de copier mes dll dans le répertoire où se trouve mon jar api sur le poste client était une autre solution que j'avais envisagé et que je vais désormais approfondir.
    Par contre, quand tu dis "dossier mentionné par le file", qu'est ce que tu veux dire ?

    En fait, je pense qu'il faut que je trouve le moyen d'installer dans un même répertoire sur le poste client, le jar api ainsi que mes dlls. Je ne comprends pas trop pourquoi le lanceur JNLP ne propose ce type d'options mais bon ... A moins que j'ai loupé qqchose ????

  11. #31
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par maverick5051 Voir le message
    Par contre, quand tu dis "dossier mentionné par le file", qu'est ce que tu veux dire ?
    Celui que ta librairie calcule sous le nom de "location" Elle calcule un truc, tu fais le même calcul et t'y copie la dlls. C'est moche
    Je ne comprends pas trop pourquoi le lanceur JNLP ne propose ce type d'options mais bon ...
    Parce qu'une librairie conçue correctement ne fais pas la tambouille que fais ta librairie . Le lanceur jnlp fait ce qui est standard, a savoir amener ta dll dans le "library path" de l'application, library path qui est l'endroit que la jvm utilise par défaut pour charger les dlls / .so additionels.

  12. #32
    Membre chevronné
    Avatar de fxrobin
    Homme Profil pro
    Architecte SI, Java Fan, API Manager
    Inscrit en
    Novembre 2007
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte SI, Java Fan, API Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 875
    Points : 2 112
    Points
    2 112
    Par défaut
    Citation Envoyé par maverick5051 Voir le message
    En fait, je pense qu'il faut que je trouve le moyen d'installer dans un même répertoire sur le poste client, le jar api ainsi que mes dlls. Je ne comprends pas trop pourquoi le lanceur JNLP ne propose ce type d'options mais bon ... A moins que j'ai loupé qqchose ????
    j'ai peut-être une idée.
    Avant de lancer "ta" librairie, copie (via InputStream / OutputStream) la DLL qui est dans le JAR (getResourceAsStream) pour la mettre dans le répertoire temporaire de l'utilisateur (propriété de la classe System). Ensuite donc tu as ta "location" que tu peux donner à ton API (par exemple "d:\temp\madll.dll") ... et donc commencer à lancer réellement ton applet "métier".

    C'est "moche, archi-moche" comme dirais Tchize , mais je pense que ça marcherait.
    Moins on code, moins il y a de bug ... et vice-versa ainsi qu'inversement ...

  13. #33
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 32
    Points : 10
    Points
    10
    Par défaut
    Pour le location de mon api, je ne peux pas jouer dessus malheureusement.
    Pour la copie des DLLs, c'est ce que je fais actuellement par la méthode que tu indiques.

    Ce que je souhaite faire (au mieux), c'est :
    En admettant que apiJni.jar et nativeLib.jar sont téléchargés dans le même répertoire destination sur le poste client:
    1- Récupérer le répertoire de destination des téléchargements sur le poste client
    2- Unjaré (au moyen de InputStream/OutputStream comme l'indique fxrobin => ça marche très bien) mon nativeLib.jar dans ce répertoire

    Normalement, cela devrait fonctionner mais (parce qu'il y a toujours un mais ) comment puis-je récupérer le répertoire destination de mes téléchargements sur le poste client ? Est-ce possible ?

  14. #34
    Membre chevronné
    Avatar de fxrobin
    Homme Profil pro
    Architecte SI, Java Fan, API Manager
    Inscrit en
    Novembre 2007
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte SI, Java Fan, API Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 875
    Points : 2 112
    Points
    2 112
    Par défaut
    Normalement pas besoin de savoir où le JAR est puisqu'il est déclaré en ressource. dans le JNLP.

    Donc un this.getResourceAsStream("monfichier.dll") t'ouvre un InputStream dessus et tu pourras mettre la DLL où tu veux.

    Au pire tu récupères ta DLL avec une "bonne vieille" connexion HTTP dans ton applet que tu écris là où tu veux sur le disque de l'utilisateur. Dans ce cas, utilise Commons HttpClient, c'est plus simple.
    Moins on code, moins il y a de bug ... et vice-versa ainsi qu'inversement ...

  15. #35
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 32
    Points : 10
    Points
    10
    Par défaut
    Le this.getClass().getResource() me retourne null (je suis dans le code de mon applet) => es-tu sûr de ton coup ?

    De plus, mes dlls doivent être incluses dans un jar pour que JNLP fonctionne.
    En gros, dans mon JNLP, j'ai une ligne nativelib dans resource pointant vers un jar incluant mes dlls.
    Du coup, je fais un this.getClass().getResource("apiJni.jar") pour récupérer le jar que je unjar par la suite

    Dites, sinon, je viens de trouver ça => http://jnlp.sourceforge.net/netx/news.html

    Avez-vous déjà utilisé ? J'ai l'impression que je peux trouver de l'aide là-dedans ...

  16. #36
    Membre chevronné
    Avatar de fxrobin
    Homme Profil pro
    Architecte SI, Java Fan, API Manager
    Inscrit en
    Novembre 2007
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte SI, Java Fan, API Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 875
    Points : 2 112
    Points
    2 112
    Par défaut
    le nom de fichier dans getResourceAsStream est donné soit de manière absolue (en commençant par "/"), soit de manière relative par rapport à la classe d'où tu l'invoques.
    Moins on code, moins il y a de bug ... et vice-versa ainsi qu'inversement ...

  17. #37
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 32
    Points : 10
    Points
    10
    Par défaut
    Pas mieux ???

  18. #38
    Membre chevronné
    Avatar de fxrobin
    Homme Profil pro
    Architecte SI, Java Fan, API Manager
    Inscrit en
    Novembre 2007
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte SI, Java Fan, API Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 875
    Points : 2 112
    Points
    2 112
    Par défaut
    J'essaierai de te faire un PoC mais là je n'ai pas trop le temps d'ici à ce week-end.
    Moins on code, moins il y a de bug ... et vice-versa ainsi qu'inversement ...

  19. #39
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 32
    Points : 10
    Points
    10
    Par défaut
    Bon, j'avance un peu.

    Je viens de décrouvrir netx => http://jnlp.sourceforge.net/netx/news.html

    Et c'est franchement génial. En faisant seulement ce petit bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    JNLPRuntime.setDebug(true);
    JNLPFile jnlpFile = null;
    try {
       String url = getCodeBase().toExternalForm() + "AgentCom.jnlp";
       jnlpFile = new JNLPFile(new URL(url));
    } catch (ParseException e) {
       e.printStackTrace();
    }
    JNLPClassLoader jnpClassLoader = JNLPClassLoader.getInstance(jnlpFile, new UpdatePolicy());
    J'obtiens tous mes livrables sur le poste client ....
    Maintenant, il me reste à copier mes DLLs au bon endroit ...

  20. #40
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    En gros, si je suis bien, t'es parti pour faire une applet, qui embarque un javawebstart, ui va lancer le jnlp concerné

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. comment accéder aux ressources locales à partir d'une appli web
    Par lginoux dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 01/04/2009, 10h46
  2. Réponses: 1
    Dernier message: 19/02/2008, 09h03
  3. impossible de copier coller à partir d'une applet
    Par sof1980 dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 20/10/2006, 15h58
  4. Réponses: 4
    Dernier message: 22/12/2005, 11h43
  5. [IO][FTP] faire un FTP a partir d'une applet
    Par irkirabie dans le forum Applets
    Réponses: 3
    Dernier message: 19/11/2004, 15h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo