Charger une dll en java

cs_lak75 Messages postés 71 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 3 avril 2008 - 29 nov. 2007 à 17:04
 cs_merioma - 14 avril 2008 à 12:47
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

75 réponses

Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
4 déc. 2007 à 14:11
SAlut,

deux solutions :
    1 - Tu wrappes TOUTES les méthodes de rapi.dll afin de la rendre full compatible avec java
    2 - Tu ne wrappes que les fonctions que tu as besoin.

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

OoWORAoO
0
cs_lak75 Messages postés 71 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 3 avril 2008
4 déc. 2007 à 14:36
je me suis mal exprimé, en effet il y a deux choses qui ne sont pas
encore clair pour moi.
1> je ne sais pas quoi mettre dans le programme c. est ce qu'il suffie
de declaré le nom de la methode qui est définie dans la dll.
2> une fois la classe c est compilé, est ce qu'il faut mettre
l'exécutable dans le projet java.
je te remercie pour tes explications
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
4 déc. 2007 à 14:49
Salut,

1 > je ne risque pas de le savoir pour toi. pour savoir ce que tu doit faire regarde l'exemple du 'print'
2 > Il ne faut pas faire un éxecutable mais une librairie dynamique, sinon oui il te faut mettre la librairie dans ton projet java afin que la jvm puisse trouver la définition des méthodes natives...

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

OoWORAoO
0
cs_lak75 Messages postés 71 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 3 avril 2008
4 déc. 2007 à 15:16
Salut,
Dans la classe Test j'ai défini une méthode native CeRapiInit().
Après le lancement de la commande javah -jni -verbose Test, j'ai
obtenu le fichier Test.h :
***************************************
#include <jni.h>
/* Header for class Test */

#ifndef _Included_Test
#define _Included_Test
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Test
* Method: CeRapiInit
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_Test_CeRapiInit
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
************************************************
En suivant ton exemple j'ai défini un fichier Test.c ,
est ce que c'est suffisant pour l'utilisation de la methode CeRapiInit ?

#include "Test.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: Test
* Method: CeRapiInit
*/
JNIEXPORT int JNICALL Java_Test_CeRapiInit () {

return CeRapiInit();

}

Merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
4 déc. 2007 à 15:38
Salut,

nan la fonction Java_Test_CeRapiInit t'est pas correcte... dans le fichier .h, tu as le prototype suivant :

JNIEXPORT jint JNICALL Java_Test_CeRapiInit (JNIEnv *, jobject);

donc celle de ton .c tu devrais avoir ça :

[...]
/*

* Def du comportement de la méthode java

* Class: Test

* Method: CeRapiInit

*/

JNIEXPORT int JNICALL Java_Test_CeRapiInit (JNIEnv *env, jobject jtest) {

    return CeRapiInit();

}

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

OoWORAoO
0
cs_lak75 Messages postés 71 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 3 avril 2008
5 déc. 2007 à 15:53
Salut,
je cherche a compiler le programme c pour générer la librairie
dynamique.
je n'ai pas le C sur mon ordi par contre je l'ai sur un autre ordi
sous linux. Si je copié les 3 fichiers dans un répertoire sous linux
(Test.h, Test.c et jni.h) tu crois que c'est suffisant ?
Merci
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
5 déc. 2007 à 16:14
Salut,

ATTENTION : visiblement tu cherches à utiliser une api windoz pour faire ton programme donc si tu compiles la lib dynamique sous linux il est bien entendu que tu ne pourras pas l'utiliser sous windoz, de plus tu ne pourras pas non plus la compiler...

install visual express c++ sur ton windoz, il est gratos en plus...

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

OoWORAoO
0
cs_lak75 Messages postés 71 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 3 avril 2008
5 déc. 2007 à 16:27
ok merci
pour ta réponse
a+
0
cs_lak75 Messages postés 71 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 3 avril 2008
6 déc. 2007 à 15:06
salut
j'ai installer visual c++, j'ai copier le fichier Test.h dans le
projet. J'ai crée un programme Test.c.
Aprés la compilation il m'affiche cette erreur :
fatal error C1083: Cannot open include file: 'jni.h': No such file
or directory
j'ai meme recopié le fichier jni.h dans le projet mais j'ai toujours
cette erreur.
est ce que tu as une idée, car c'est la premiere fois où j'utilise
visual c++
merci
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
6 déc. 2007 à 15:16
Salut,

oui, il te faut rajouter le rep <jdk>/include et <jdk>/include/windows dans le path de recherche des includes de ton IDE.... suit ce tutos ICI, à un moment il en parle pour le sdk de windows mais fait la même pour ceux du jdk

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

OoWORAoO
0
cs_lak75 Messages postés 71 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 3 avril 2008
6 déc. 2007 à 19:10
salut

J'ai ajouté le rep du jdk dans mon ide et ça marche. Voilà mon programme c :

*****************************************************
#include "Test.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: Test
* Method: CeRapiInit
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT int JNICALL Java_Test_CeRapiInit (JNIEnv *env, jobject jtest) {
return CeRapiInit();
}
*****************************************************
Il m?a affiché des erreurs : error C2143: syntax error : missing '{' before '__stdcall'

J'ai effacé ce bou du programme :

*************************************************
#ifdef WIN32
#include <windows.h>

bool WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved){
return TRUE;
}
#endif
*****************************************************
Et j'ai laissé que ça :
****************************************************
#include "Test.h"
/*
* Def du comportement de la méthode java
* Class: Test
* Method: CeRapiInit
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT int JNICALL Java_Test_CeRapiInit (JNIEnv *env, jobject jtest) {
return CeRapiInit();
}
**********************************************************
Est-ce que c'est suffisant ?

Une fois la compilation est faite, qu'est ce que je mets dans mon projet java car je ne connais pas trop en c.

Je te remercie
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
6 déc. 2007 à 19:35
Salut,

noooon, il ne faut pas enlever le
bool WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved){

        return TRUE;

}

c'est le main de ta DLL donc si tu l'enlèves ça ne risque pas de fonctionner.....
limite enlève simplement les :
#ifdef WIN32

et
#endif

et remplaces le 'bool WINAPI DllMain' par 'BOOL WINAPI DllMain' vu que bool en minuscule est plus adapté au C++

"Une fois la compilation est faite, qu’est ce que je mets dans mon projet java car je ne connais pas trop en c.
" <---- relis les anciens poste je t'ai déjà répondu.

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

OoWORAoO
0
cs_lak75 Messages postés 71 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 3 avril 2008
7 déc. 2007 à 09:01
salut,
tu m'as dit qu'il faut ajouter la librairie dynamique dans le projet
java. quel est l'extention de ce fichier qu'il faut ajouter (je
no connais pas trop ni en c ni en c++) ?
merci
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
7 déc. 2007 à 09:49
Salut,

okok, bon exemple pour la lib dynamique 'toto' :
sous windows tu auras le nom 'toto.dll'
sous unix tu auras le nom 'libtoto.so'

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

OoWORAoO
0
cs_lak75 Messages postés 71 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 3 avril 2008
7 déc. 2007 à 11:04
salut,
oui mais en compilant mon programme c, je n'ai pas ce fichier .dll.
A part ma librairie Rapi.dll je n'ai pas un autre fichier .dll.
je ne sais pas quoi ajouté dans mon projet java pour enfin tester
est ce que je peux utiliser la methode CeRapiInit de la librairie
Rapi.dll?
merci
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
7 déc. 2007 à 11:24
Salut,

je te conseil de faire un séjour sur cppfrance et d'y poser ta question car maintenant c'est uniquement un problème de C/C++ avec l'IDE MS...

Sinon juste pour te mettre sur la voie il te faut créer un projet DLL et non un exécutable...

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

OoWORAoO
0
cs_lak75 Messages postés 71 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 3 avril 2008
7 déc. 2007 à 14:03
oui mais sur visual c++, il ne me donne pas la possibilité de
choisir le type de projet.
est ce que tu sais comment choisir le type ?
merci
0
cs_lak75 Messages postés 71 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 3 avril 2008
7 déc. 2007 à 14:08
salut,
Excuser moi pour toutes ces questions.
une fois j'ai mon fichier.dll, est ce que il suffit de le mettre dans
mon projet java ou il faut que je le charge à partir de mon programme
avec System.loadLibrary()?
merci
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
7 déc. 2007 à 14:34
Salut,

"

oui mais sur visual c++, il ne me donne pas la possibilité de

choisir le type de projet."
je ne fais pas support pour les IDE MS... de plus à mes yeux tu ne fais pas de JNI si tu ne connais pas bien le java et surtout le C/C++....

"...est ce que il suffit de le mettre dans

mon projet java ou il faut que je le charge à partir de mon programme

avec System.loadLibrary()?
"
heuuuuu, tu lis mes réponses ? si tu reprend un de mes premiers postes (page 1) tu verras :
"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."


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

OoWORAoO
0
cs_lak75 Messages postés 71 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 3 avril 2008
10 déc. 2007 à 10:45
salut,
j'ai réussie a configurer visual c++ pour avoir le choix de créer un
projet dll.
dans le repertoire "source file" j'ai mon programme TestRapi.c :
************************************
#include "Test.h"
#include <windows.h>

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

JNIEXPORT int JNICALL Java_Test_CeRapiInit (JNIEnv *env, jobject jtest) {
return CeRapiInit();
}

***********************************************
dans le repertoire Header file j'ai le fichier Test.h

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

#ifndef _Included_Test
#define _Included_Test
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Test
* Method: CeRapiInit
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_Test_CeRapiInit
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
*********************************************

Aprés la compilation je ne trouve pas dans le projet le fichier .dll
que je cherche.
je trouve projet.ncb , projet.sln, projet.suo.
est ce que tu as ideé ?
merci
0
Rejoignez-nous