Bonjour,
Je sais que pour communiquer avec un pgm écrit en c++ ou en c on doit passer par JNI.
Mais, si on a une dll déjà prete comment on va l'utiliser dans un code Java?
Merci.
Aida.
Bonjour,
Je sais que pour communiquer avec un pgm écrit en c++ ou en c on doit passer par JNI.
Mais, si on a une dll déjà prete comment on va l'utiliser dans un code Java?
Merci.
Aida.
Imaginons une dll HelloWorld.dll contenant la méthode printCpp(). Il suffit de fairepour appeler la méthode printCpp()
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 public class HelloWorld { static { System.loadLibrary("HelloWorld"); } public static native void printCpp(); public static void main(String args[]) { System.out.print("Hello "); HelloWorld.printCpp(); } }
Oui, je vois mais une petite question si la dll est compilée et je n'ai pas son source est ce que je peux l'utiliser sans se préoccuper du fichier d'en tete s'il existe ou non,???
Aida.
Je ne sais pas si c'est possible. Par contre tu pourrais peut-être exécuter une commande shell qui exécuterais la méthode que tu souhaite?.
C'est vrai que ce serait intéressant de pouvoir utiliser par JNI des méthodes de dll déja compilées mais je ne crois pas que ce soit possible. Si quelqu'un sait comment faire ... :
Bonjour,
Il faut que dans ta propre dll, crée à partir de jni, tu fasse appel aux méthodes de ta dll déjà créée. Ta propre dll va faire seulement le lien entre JNI et la dll éxistante.Envoyé par Aida
Si tu n'as pas le header, il existe les méthodes LoadLibrary/FreeLibrary. Elles sont spécifiques à windows par contre (à vérifier). Demande sur le forum adéquat pour plus de précisions.
Bonne chance.
@+
Bonjour,
Est ce que tu veux dire queje dis créer une dll en c++ qui appelera la dll dont je dispose pas du code source???
Ou bien que je dois appeler la dll compilée sans se préoccuper du fichier d'en tete??
Je n'ai pas compris, tu peux clarifier un peu STP??
Et pour les forums adéquets, que me conseilles tu comme forum???
Merci d'avance.
Aida.
Bonjour,
Le plus simple c'est donc de récupérer un header pour ta dll existante et écrire une DLL de transition (avec une fonction jni pour chacune des fonction de ta dll) que tu pourra utiliser dans Java.
Bon courage.
OUi, mais, on vient de me faire savoir que je peux telecharger une dll en JAVA sans fichier d'entete, mais je ne sais pas comment le faire???
Aida.
Bonjour,
Tu ne peux pas utiliser directement une dll en java. Il te faut passer par JNI;
Pour faire cela, tu dois créer ta propre dll. Cette dll sera juste une "interface" ou pour reprendre la formulation de Abalam ( ) "une DLL de transition". Tu ne peux pas faire autrement.
Ensuite, pour le second problème, celui du header, comme je te l'ai dis il y a un moyen de charger dynamiquement cette dll (dans ta propre dll). Mais de toute facon, il te faudra, d'une manière ou d'une autre avoir accès à la doc de celle-ci. Histoire de savoir quelles méthodes, avec quels arguments appeller
C'est plus clair?
@+
Oui merci.
J'ai une doc sur les méthodes de la dll, mais lorsque j'ai contacté le proprietaire de la ddl, il m'a dit que je peux appeler la dll directement dans mon code java sans aucun problème, il m'a dit que je dois la charger dans mon code java et appeler par la suite les fonctions, il m'a dit que je dois chercher une fonction en javaqui fera l'affaire, mais je ne trouve pas.
Et pour cotre réponse, je vois ce que vous voulez dire, mais, vraiment j'essaie d'eviter le c++ pcq je ne programme pas avec, c tt.
Alors, s'il y a une solution???
Merci.
Aida.
bonjour
si le proprietaire de la dll te dit que tu peux charger directement sa dll dans le prog java, ca veut dire qu'il l'a developpe en vue non seulement d'une utilisation normale type C++ je pense mais aussi avec une utilisation avec java par du jni
Mais j'en doute. Pourquoi ? Puisque pour faire le lien jni entre java et c++, tu commences par declarer ta methode native en java qui appellera la dll, ensuite tu generes l'en-tete de la methode C++ avec le javah de la jdk, cela te donne le squelette de tes methodes C++ contenues dans la dll qui sont appelees par java, cependant le nom de ces methodes C++ est construit a partir :
- du nom du package dans lequel se trouve le prog java que tu executes
- du nom de la classe java du prog java que tu executes
- du nom des methodes natives declarees dans ta classe java
et le type des methodes egalement : fonction (boolean, string,int) ou procedure (void)
Donc l'auteur de la dll que tu veux utiliser n'a pas pu anticiper sur les differents noms que tu as pu utiliser pour package,classe,methode java de ton prog java, or si c'est le cas, ca veut dire qu'il faut que tu recherches dans la dll donc que tu aie au minimum la doc et au mieux les sources pour identifier les structures java que l'auteur de la dll a utilise en analysant les noms des methodes ecrites pour etre appelees par des prog java, et tu dois alors te conformer a cette structure de noms pour pouvoir utiliser cette dll directement dans java SI elle a ete prevu pour etre utilisee egalement avec java par du jni, que ce soit au niveau des noms de package, de classes ou de methodes natives java.
En clair je doute fortement que tu puisse utiliser cette dll directement dans java, donc le mieux a mon avis pour toi :
- tu as cette dll deja faite avec la doc pour connaitre les methodes de cette dll
- tu identifies les methodes de cette dll que te sont necessaires pour le prog java
- suivant l'utilisation que tu veux en faire dans ton prog java, tu declares les methodes natives java correspondant aux methodes de la dll en question
- tu generes l'en-tete de ces methodes natives par l'outil de la jdk javah
- tu ecris et developpes une nouvelle dll C++ (ca va etre dur de ne pas passer par de la prog C++ !!!) basees sur le squelette des methodes C++ generees par javah
- tu vas charger dans cette nouvelle dll, la dll importee dont tu n'as pas les sources
- dans ta nouvelle dll C++, ces methodes dont tu as genere l'en-tete vont encapsuler les methodes C++ presentes dans la dll importee en s'occupant egalement dans des conversions de types C++/ java (souvent prise de tete au debut quand tu decouvres toutes les manip a faire pour passer par exemple un vector java en C++ ou inversement)
Donc au final tu as :
- ton prog java issu d'une classe java dans un package ou non
- ta dll C++ de transit java/C++ par jni
- la dll C++ importee
et donc ton prog java charge la dll C++ de transit jni qui elle-meme charge la dll importee.
Voila, au debut je pensais que je serais assez clair, mais en relisant je trouve que c'est bien complique tout ce que j'ai dis !!! Enfin j'espere avoir repondu a ta question du mieux possible. En tout cas si j'ai fait des erreurs qu'on me le signale svp pour que j'evite de propager ces erreurs.
@+
Bonjour,
D'abord merci beaucoup pour votre réponse.
Oui, je vois ce que vous vouliez dire on m'a conseillé la meme chose, mais le problème c'est que je ne sais pas appeler une dll en c++, si qqn connait un lien qui peut m'aider je serai reconnaissante.
Merci une autre fois.
Aida.
essaie sur ce tutoriel : http://lfe.developpez.com/DLL/ , je crois que c'est expliquer comment charger une dll
ou alors fais une recherche avec des mots cles comme C++ dll charger ou appeler, ca doit bien se trouver dans des tutoriels
Bonjour,
Mais ça montre juste comment charger une dll en builder c++, moi j'utilise borland alors, j'utilise la meme procedure ou bien non?
Merci.
Aida.
pour appeler ta dll tu peux créer un projet en c++ (avec l'environnement que tu utilise ) puis tu n'as qu'à faire : ajouter libreries, ou ressources depuis le menu que tu utilise
Bonsoir,
Merci pour votre réponse.
Mais, si je crée la dll de transition avec Builder c++ est ce que je serais capable de l'interfacer avec java en utilisant JNI????
Aida.
Bonjour,
Oui, cela ne dépends pas de ton environnement de programmation.Envoyé par Aida
Voila un exemple, qui devrais t'aider. Imaginons que tu veillle utiliser une dll nommée "autredll" et plus particulièrement une de ces méthodes :
Commence par créer ta classe java :
Code : Sélectionner tout - Visualiser dans une fenêtre à part int fonction(char* uneParametre, int unAutreParametre)
Compile et crée le header avec javah. Ensuite dans ta dll (jnidll) tu auras un truc du genre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 public class TestJNI{ public native void appelFonction(); static{ System.loadLibrary("jnidll");//nom de ta dll } public static void main(String[] args){ new Test().appelFonction(); } }
Voila, voila ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 typedef int (__stdcall *MYDLLFUNC)(char*,int);//pointeur sur fontion(char*,int) de autredll.dll //... JNIEXPORT void JNICALL Java_Test_appelFonction(JNIEnv * env, jobject obj){ HINSTANCE dll; MYDLLFUNC methode; int resultat; if ((dll=LoadLibrary("autredll.dll"))) {//chargement de la dll methode = GetProcAddress(dll, "fonction");//chargement de la méthode if (methode) { resultat = methode("parametre",5);//appel de la méthode printf("%s%d","Le resultat est : ",resultat);//traitement }else{ printf("Fonction introuvable"); } FreeLibrary(dll);//libération de l'autre dll } return; }
Ensuite, il ne te reste plus qu'à faire un tour des tutos sur JNI. Pour pouvoir, par exemple, transferer des données de java vers un autre langage (et inversement).
Bonne chance.
@+
Bonjour,
OUi, c'est ce que j'ai fait, mais je n'arrive pas à appeler la dll externe ou plutot je n'arrive pas à la charger.
Le code que j'ai fait est:
J'ai utilisé Builder c++ 3.0 mais il ne connait pas la dll.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 #include <vcl\vcl.h> #include<stdio.h> #pragma hdrstop #include "windows.h" #include "Main.h" //--------------------------------------------------------------------------- #pragma resource "*.dfm" TMainForm *MainForm; //--------------------------------------------------------------------------- typedef long (__stdcall *MYDLLFUNC)(char[]); typedef long (__stdcall *MYDLLFUNC1)(long,char[]); __fastcall TMainForm::TMainForm(TComponent* Owner) : TForm(Owner) { } //---------------------------------------------------------------------------- void __fastcall TMainForm::ButtonClick(TObject *Sender) { HINSTANCE hinstDLL; MYDLLFUNC ImpFuncDLL; MYDLLFUNC1 ImpFuncDLL1; long iRet; long iRet1; char *message="-text Bonjour -speaker Thierry_(fr1)"; if ((hinstDLL = LoadLibraryA("c:\Program Files\Borland\CBuilder3\Projects\euler.dll"))) { ImpFuncDLL = (MYDLLFUNC) GetProcAddress(hinstDLL,"eulerInit"); if (ImpFuncDLL) { iRet = ImpFuncDLL("c:\Program Files\Borland\CBuilder3\Projects\euler.ini"); } else { this->Caption="Impossible2"; } ImpFuncDLL1 = (MYDLLFUNC1) GetProcAddress(hinstDLL,"eulerRun"); if (ImpFuncDLL1) { iRet1 = ImpFuncDLL1(iRet,message); } FreeLibrary(hinstDLL); } else { this->Caption="Impossible1"; } } //---------------------------------------------------------------------------
Merci.
Aida.
[ Modéré par vedaer ]
-> Ajout des balises code
[ Merci de respecter les Règles du Forum ]
Bonjour,
C'est à dire? Un problème de compilation? Un problème d'éxecution?Envoyé par Aida
T'es sur que ce n'est pas un problème de path? Essaye de doubler les \ dans le path
Je ne m'y connais pas assez pour t'aider plus. Sinon, demande sur le forum approprié, c'est désormais plus un problème de C/C++ qu'un problème de java/JNI
Bon courage.
@+
bonjour,
oui, en fait ça se compile avec deux warning "comme quoi l'emplacement n'est pas correct", j'ai doublé les slashs, toujours même problème, à vrai dire je ne peux pas acceder à la fonction de la dll, pourquoi je sais pas, ok je vais faire ce que vous m'avez suggéré et surtout merci beaucoup pour ta coopération que j'ai apprécié.
aida.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager