begin process at 2010 02 09 22:28:57
  Trouver un code source :
 
dans
 
Accueil > Forum > 

JAVA / J2EE / J2ME

 > 

Divers

 > 

Général

 > 

charger une dll en java


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

charger une dll en java

jeudi 29 novembre 2007 à 17:04:53 | charger une dll en java

lak75

Bonjour, En Java, comment utiliser les fonctions de la librairie RAPI.dll pour les transferts entre Pc et Pocket ? J’ai une appli java qui tourne sur pc avec un serveur jboss et je cherche à lire un fichier enregistré sur pda. J'ai réussi à l'attacher, mais pas capable d'exécuter ses fonctions. Quand je référencie la fonction CeRapiInit() par exemple: public static native long CeRapiInit(); J'ai le message : Error [action] Servlet.service() for servlet action threw exception Java.lang.unsatisfieldLinkError: CeRapiInit. Est-ce que quelqu’un à une idée ? Merci
jeudi 29 novembre 2007 à 19:46:55 | Re : charger une dll en java

Twinuts

Membre Club Administrateur CodeS-SourceS
Salut,

il te faut écrire un wrapper JNI




------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
vendredi 30 novembre 2007 à 09:23:44 | Re : charger une dll en java

lak75

C'est-à-dire ? Je n’ai pas très bien compris ? Merci
vendredi 30 novembre 2007 à 22:06:07 | Re : charger une dll en java

gouessej

System.load("c:/ton_chemin/ta_lib.dll");


TUER : http://tuer.tuxfamily.org/tuer.php

yeah! vive java
samedi 1 décembre 2007 à 00:11:01 | Re : charger une dll en java

gouessej

essaie loadLibrary sinon

TUER : http://membres.lycos.fr/javalution/tuer.php

yeah! vive java
samedi 1 décembre 2007 à 11:01:00 | Re : charger une dll en java

Twinuts

Membre Club Administrateur CodeS-SourceS
Salut,

cela ne suffit pas....regarde ICI tu comprendra peut-être ce qu'est le JNI et pourquoi tu dois l'utiliser pour faire ce que tu veux...




------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
lundi 3 décembre 2007 à 09:31:10 | Re : charger une dll en java

lak75

Salut, merci pour les reponses, ce que je ne comprend pas c'est que j'ai bien la dll avec les methodes que j'ai besoin. je charge cette dll dans le programme java et je defini des metodes natives pour les utiliser. mais ça ne marche pas. pour quoi je suis obligé de programmer un autre programme en c pour faire l'intermediare alors que la dll est bien ecrite en c? et si jamais je suis obligé d'ecrire ce programme en c, est ce que vous avez un exemple simple pour comprendre? car je ne sais pas quoi ecrire dans le fichier et dans quel repertoire il faut le mettre? merci pour votre aide.
lundi 3 décembre 2007 à 11:22:20 | Re : charger une dll en java

Twinuts

Membre Club Administrateur CodeS-SourceS
Salut,

java reste un langage haut niveau donc, si tu veux linker une lib dynamique avec lui, il te faut impérativement la wrapper avec une couche JNI, afin que la jvm puisse retrouver ses petits...

regarde sur le lien ci-dessous pour une explication :
http://en.wikipedia.org/wiki/Java_Native_Interface

et sur celui-ci pour le tutos :
http://java.sun.com/developer/onlineTraining/Programming/JDCBook/jni.html




------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
lundi 3 décembre 2007 à 13:56:34 | Re : charger une dll en java

lak75

salut, les exemples que j'ai trouvés montrent comment on ecri un programme en c et comment on l'utilise en java. mais moi j'ai une librairie, je connais le nom de quelques methodes que je compte utilisé.... est ce que tu as compri mon pb? merci
lundi 3 décembre 2007 à 15:12:51 | Re : charger une dll en java

Twinuts

Membre Club Administrateur CodeS-SourceS

Salut,

oui, j'ai très bien compris.... et visiblement tu ne cernes pas vraiment le but de JNI...

Pour faire simple :
Imagine que tu as une dll écrite en C/C++ et que tu veuilles l'utiliser dans ton application java (ce qui est ton cas). Cette DLL te permet d'afficher un message sur la console (le cas simple d'un printf), pour l'utiliser tu devras wrapper les fonctions avec JNI, exemple :

dans la dll tu as la méthode 'void print(char *str);' qui n'est pas utilisable tel quelle dans ton application java. Maintenant il te faut écrire le wrapper, donc commence par la partie java (exemple avec une classe Print.java):

public class Print {

    static {
        // demande à la jvm de charger ta librairie,
        // ici tu ne mets que le nom court de la lib (sans l'extension).
        System.loadLibrary("Print");
    }

    // ici tu précises à la JVM que le comportement de la méthode sera fait nativement (en C ou C++)
    public native void print(String str);

}

voici maintenant la classe java pour le test (je parlerai après de la partie C/C++)
public class Test {
   
    public static void main(String ...argv) {
        Print p = new Print();
        p.print("Hello de java\n");
    }

}

Pour exécuter l'application dans un premier temps le mieux est de mettre l'option '-Djava.library.path=chemin' à la ligne de lancement sinon, si tu ne veux pas te prendre la tête sous windoz tu rajoutes la lib dans le système32.

Bref avant de mettre en place le code C/C++, il te faut demander à la jvm de te générer un fichier header(.h) associé à ta classe Print.java, pour ce faire utilise la commande :
javah -jni -verbose Print

Note : ici Print n'est autre que le fichier Print.class (pas le .java)


Passons au code C/C++, ici on fait appel à la fonction printf du C (vois ça comme la fonction de ta DLL). Tu fais un projet DLL avec ton IDE (en gros l'utilisation simple de JNI se base sur des DLL représentant ton wrapper entre le monde java et le monde C/C++), tu le link avec les fichiers include de la jvm(voir la doc de ton IDE pour ajouter des includes dans le path) <jdk_version>/include et <jdk_version>/include/tonOs, enfin tu ajoutes le fichier Print.h à ton projet :

ton fichier Print.h devrait ressembler à ça :

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Print */
#ifndef _Included_Print
    #define _Included_Print

    #ifdef __cplusplus

        extern "C" {

    #endif

    /*
    * Class: Print
    * Method: print
    * Signature: (Ljava/lang/String;)V
    */

    JNIEXPORT void JNICALL Java_Print_print (JNIEnv *, jobject, jstring);

    #ifdef __cplusplus
        }
    #endif
#endif


maintenant tu codes le fichier Print.c (pourquoi pas) en lui indiquant le dll main (c'est la faute à windoz si il faut même un 'main' dans une DLL)

Note: ici je ne vais pas brider l'exemple à windoz donc tu peux faire abstraction aux '#ifdef' et '#endif'.

#include <stdio.h>
#include "Print.h"

// notre dll main
#ifdef WIN32
    #include <windows.h>

    bool WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved){
        return TRUE;
    }
#endif


/*
* Def du comportement de la méthode java
* Class: Print
* Method: print
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_Print_print (JNIEnv *env, jobject jprint, jstring jstr) {
    //variables pour la copie de la chaine java vers C/C++  
    const char *utf_string; 
    jboolean isCopy;//pour tester si la copie est bonne ou non
    //copie de la chaine java
    utf_string = (*env)->GetStringUTFChars(env, jstr, &isCopy);
    //affichage de la chaine passée depuis java
    printf("%s", utf_string);
    //si la copie c'est bien passée alors on libère les ressources
    if(isCopy == JNI_TRUE)
        (*env)->ReleaseStringUTFChars(env, jstr, utf_string);
}


ATTENTION: JNIEnv ne s'utilise pas de la même façon en C et en C++, exemple :
en C tu fais :
(*env)->GetStringUTFChars(env, jstr, &isCopy);
or en C++ tu fais :
env->GetStringUTFChars(jstr, &isCopy);

Maintenant si tu veux des exemples plus complets, regarde dans les sources que j'ai déposé sur ce site (il y en à 3 je crois qui utilises du JNI à différents niveaux)






------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO

1 2 3 4 5 6 7 8

Cette discussion est classée dans : java, dll, fonctions, charger, cerapiinit


Répondre à ce message

Sujets en rapport avec ce message

hs_err_pid3240.log [ par kiss07 ] IE6 plante et J'ai ce message "fichier log":An unexpected exception has been detected in native code outside the VM.Unexpected Signal : EXCEPTION_ACCE JDBC [ par alonsyl ] bonjour,je programme habituellement en visual basic et j'essaie de me mettre a java (et jdbc en particulier).en ADO, j'ai des fonctions super qui me p Rebonjour... [ par Milie ] Bonjour,Désolé de vous embêter à nouveau mais j'ai de nouveau un p'tit probléme.Aprés une discussion avec un de mes professeurs qui est entre autre no applet java et dll [ par kawaksv2 ] Bonjour à tous,Est-ce qu'il est possible de tranformer une applet java en dll de façon à pouvoir l'utiliser en tant que composant dans un projet visua Chargement dans dll. [ par sikstar ] Bonjour, j'programme en java swing.J'voudrais créer un prog de gestion pour mon interface k8000 de chez velleman, j'ai réussi à faire ce prog en vb, m webcam [ par kakystos ] bonjour. Dans le cadre de mon projet de fin d'étude je dois réaliser une application qui affiche le flux video d'une webcam dans une fenetre dédiée a ActiveX pour VB en Java (dll??) [ par MoOx_t ] Bonjour à tous.Je suis en stage en ce moment dans une grosse boîte (EADS  ) et on me demande de réaliser un activeXen Java à utiliser dans du VB .Préc appel d'une dll fortran a partir d'un programme en java [ par melianos31 ] Bonjour.Je programme en ce moment une interface graphique en java, pour un programme en fortran.J'ai fait une dll de ce programme, je sais comment cha ActiveX sous eclipse [ par olanfr ] Bonjour à tous,Je dois réaliser un projet java sous eclipse qui doit utiliser des propriétés et méthodes d'un objet com (dll). On m'a dit que sous ecl les dlls et JAVA [ par darkjck ] Bonjour, voulant aider un projet programmé en C++, on m'a dit que le seul moyen de compatibilité c'est que je crée des dll en JAVA pour y mettre mes v


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,484 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales