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
10 déc. 2007 à 11:22
Salut,

re garde à la racine de la 'solution' (c'est comme les workspace eclipse) tu doit avoir un rep. Release et/ou Debug ta DLL doit se trouver dedans...

------------------------------------
"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 à 11:48
salut,
dans la racine de mon projet je ne trouve pas un ficher .dll, j'ai
un repertoire "Debug". Dans ce repertoire je trouve : BuildLog.html,
TestRapi.obj, vc80.idb et vc80.pdb
alors que pendant la création de mon projet j'ai bien choisi le
projet dll
je n'ai pas d'erreur pandant la compilation, j'ai 2 warning :
warning c4142: benign redefinition of type
warning c4013: CeRapiInit undefined; assuming extern returning int
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
10 déc. 2007 à 12:14
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" />
<title>
</title>
<meta name="GENERATOR" content="OpenOffice.org 2.3 (Linux)" />
<style type="text/css">
<!--
@page { size: 21cm 29.7cm; margin: 2cm }
P { margin-bottom: 0.21cm }
-->
</style>
Salut,

Les warning ne sont pas
beau....surtout le :
warning c4013: CeRapiInit undefined; assuming
extern returning int
(je suis presque certain que ça ne
marchera pas à cause de ce warning vu que MS à une
méthode super space pour utiliser une fonction provenant d'une
DLL et que là tu ne l'utilise pas)

sinon, tu
vois ton projet (celui avec des fichier .c, etc... et un répertoire
Debug, bah lui c'est le répertoire projet (tu le savais je
n'en doute pas), remonte d'un cran et tu seras dans le répertoire
de la 'solution' (c'est ici que devrait également ce trouver
un répertoire Debug contenant ta DLL)













------------------------------------
"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 à 13:46
excuse je n'ai pas compri,
c'est quelle methodes que je n'utilise pas? c'est vrai je pense que
c'est a cause de ce warning mais je ne sais pas qu'est ce qu'il
faut modifier?
sinon pour le repertoire, je trouve bien le repertoire Debug mais
sans la dll....
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
10 déc. 2007 à 14:58
Salut,

Regarde dans la MSDN ou dans les sources (ou messages du forum) de cppfrance comment utiliser les fonctions :
- GetModuleHandle
- GetProcAddress
- FreeLibrary

car sous windows, si tu n'as pas un .a ou .lib, tu ne pourras pas utiliser ta DLL directement dans un code C/C++, bienvenue dans le monde du C/C++ sous windows...de toute façon avant d'aller plus loin dans ton projet tu es obligé de maitriser un minimum  le C/C++ sous windows...

------------------------------------
"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 à 15:08
je ne comprend pas,
ma dll je vais l'utilisé en java et pas en c++. j'ai géneré le fichier
Test.h et c'est ce fichier que j'utilise en c.
en effet j'ai 2 application java (un client lourd qui tourne sur
un pda et qui enregistre des données sur ce pda)et(un client légé
qui tourne sur un pc). le seul pb c'est de recuperer ce fichier a
partir du pc (je pense que le seul moyen c'est d'utiliser
la librairie Rapi.dll de activSync).
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 à 15:26
salut,
J'ai une question, voilà la définition de la fonction CeRapiInit

*****************************************************
HRESULT CeRapiInit(void);
Return Values
S_OK indicates success. E_FAIL indicates failure.
*****************************************************

Dans mon programme java, je l'ai déclarée comme ça :

****************************************************
public class Test
{
static {System.loadLibrary("rapi");}
public native int CeRapiInit();
public Test(){}
}
********************************************************
Est ce que les 2 types HRESULT et int sont compatibles ? tu crois que c'est a cause de ça que ca ne marche pas ?

merci
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
10 déc. 2007 à 16:49
Salut,

"Est ce que les 2 types HRESULT et int sont compatibles ?"
Je ne sais pas il te faut remonter jusqu'à la définition de HRESULT pour le savoir... je ne dev casiment jamais sous windoz donc les type windoz (ou proprio) et moi ça fait 2

"tu crois que c’est a cause de ça que ca ne marche pas ?
"
Oui et non, oui car les warning sont très souvent causes de problèmes, non car il te faudra à 99% loader la DLL afin de pouvoir l'utiliser... ref mon poste précédent...

------------------------------------
"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 à 17:13
salut,
sur visual c++, si je clique sur compile, j'ai aucune erreur mais je
ne trouve pas le fichier dll qui doit etre généré.
Quand j'ai cliqué sur Debug->start without Debugging : j'ai eu cette
erreur : error LNK2019: unresolved external symbol _CeRapiInit referenced in function _Java_Test_CeRapiInit@8
dans le dossier "Debug" j'ai trouve nomProjet.dll.embed.manifest,
nomProjet.dll.embed.manifest.res, nomProjet.dll.intermediate.manifest.
mais je n'ai pas le nomProjet.dll.
que penses tu?
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 à 18:08
salut,
j'ai deux questions :
quand je clique sur Debug->start without Debugging : j'ai cette
erreur : error LNK2019: unresolved external symbol _CeRapiInit referenced in function _Java_Test_CeRapiInit@8
et je n'ai pas encore le fichier NomProjet.dll
2> rien pour faire un test, j'ai modifié le return dans la fonction
Java_Test_CeRapiInit en retournant un "1"
**********************************
#include "Test.h"
#include <windows.h>

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

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

return 1:
//return CeRapiInit();
}
************************************************
et la j'ai aucune erreur et j'ai eu bien le fichier NomProjet.dll.
j'ai copié ce fichier dans le repertoire "system32" mais j'ai
toujours l'erreur dans mon application java :
java.lang.UnsatisfieldLinkError: CerapiInit

donc mes 2 questions :
1> concernant le return "CeRapiInit();" est ce que tu as une idée
pour resoudre ce pb?
2> pour quoi j'ai toujours l'erreur UnsatisfieldLinkError: CerapiInit
alors que j'ai bien copié le fichier .dll dans le repertoire de
windows?

je te remercie pour ton aide
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
10 déc. 2007 à 20:22
Salut,

"concernant le return "CeRapiInit();" est ce que tu as une idée

pour resoudre ce pb?
"
oui il faut que tu utilises lise un de mes anciens postes soit :
Regarde dans la MSDN ou dans les sources (ou messages du forum) de cppfrance comment utiliser les fonctions :
- GetModuleHandle
- GetProcAddress
- FreeLibrary

"pour quoi j'ai toujours l'erreur UnsatisfieldLinkError: CerapiInit

alors que j'ai bien copié le fichier .dll dans le repertoire de

windows?
"
La DLL s'appel bien rapi.dll ??? si oui veilles bien que le nom de la fonction C/C++ soit bien :
Java_Test_CeRapiInit (dans le .h et le .c)
public native int CeRapiInit();
(dans le .java)

Attention : Java est sensible à la casse (minuscule/majuscule).

Note: Pour ce qui est du problème 1 merci de voir ça soit sur cppfrance soit avec la MSDN car il ne s'agit que d'un problème purement C/C++ et non java ou JNI

------------------------------------
"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
11 déc. 2007 à 09:06
salut,
concernant le choix du nom de projet que j'ai crée en c (projet dll),
on peut choisir nimporte quel nom ? car dans le dossier system32
j'ai ma dll : rapi.dll et nomProjet.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
11 déc. 2007 à 09:23
Salut,

Par défaut le nom de la DLL résultante est le mem que celui de ton projet... de plus le nom de la DLL (celle qui contient du JNI) doit IMPERATIVEMENT correspondre à ce que tu as mis dans le fichier java... soit si tu as une DLL 'nomProjet.dll' dans le System.loadLibrary tu dois avoir :
static {System.loadLibrary("nomProjet");}

C'est la lib JNI que tu load pas l'autre...

------------------------------------
"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
11 déc. 2007 à 09:41
salut,
j'ai verifié les fichier .c et .h et j'ai la meme chose. l'application
qui tourne sur le pc est un client légé, j'utilise jboss comme seveur.
j'ai toujours cette erreur java.lang.UnsatisfieldLinkError :
CeRapiInit sur la console du serveur.
0
cs_lak75 Messages postés 71 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 3 avril 2008
11 déc. 2007 à 09:52
salut,
oui dans le dossier system32 j'ai les 2 dll : rapi.dll et
nomProjet.dll.
dans le programme java je charge rapi.dll
: static {System.loadLibrary("rapi");}
c'est bien ça ?
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
11 déc. 2007 à 10:25
Salut,

naaaaaaaan ^^ regarde ce que je t'ai mit plus haut...

le nom de la DLL (celle qui contient du JNI) doit IMPERATIVEMENT
correspondre à ce que tu as mis dans le fichier java... soit si tu as
une DLL 'nomProjet.dll' dans le System.loadLibrary tu dois avoir :
static {System.loadLibrary("nomProjet");}

la DLL rapi ne contient pas de JNI c'est monProjet.dll qui contient le JNI

------------------------------------
"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
11 déc. 2007 à 11:11
salut,
je n'ai pas compri. Dans ma classe test j'ai ça :
************************************
public class Test
{
static { System.loadLibrary("rapi"); }
public native int CeRapiInit();
public Test(){}
}
***************************************
aprés a partir du fichier ant j'ai généré 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
********************************************************
j'ai defini un projet c : nomProjet avec un programme Test.c
********************************************************
#include "Test.h"
#include <windows.h>

BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved){
return TRUE;
}
JNIEXPORT jint JNICALL Java_Test_CeRapiInit (JNIEnv *env, jobject jtest) {

return 1;
//return CeRapiInit();
}
*****************************************************************
j'ai eu le fichier nomProjet.dll
j'ai copié ce fichier dans le dossier system32
pour tester enfin l'utilisation de la methode CeRapiInit(), j'ai ecri
dans mon programme java :
******************************************
Test obj = new Test();
int c = (int)obj.CeRapiInit();

est ce que c'est çà ?
et là j'ai l'erreur : Java.lang.unsatisfieldLinkError : CeRapiInit
merci
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
11 déc. 2007 à 11:18
Salut,

c'est pourtant pas compliqué.... tu devrais avoir ça :

************************************

public class Test

{

    static { System.loadLibrary("nomProjet
"); }
// c'est dans la DLL nomProjet que tu as la couche JNI pas l'autre..... pour tant je suis clair depuis t'aleur
    public native int CeRapiInit();

    public Test(){}

}

***************************************

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

********************************************************

Test.c

********************************************************

#include "Test.h"

#include <windows.h>

BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved){

        return TRUE;

    }

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

  

return 1;

//return  CeRapiInit();

}

*****************************************************************

******************************************

Test obj = new Test();

int c = <strike>(int)</strike>
obj.CeRapiInit();
(pas besoin de cast...)

------------------------------------
"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
11 déc. 2007 à 11:39
salut,
je ne vois pas comment tu charge la dll nomProjet.dll alors qu'elle
est meme pas encore crée.
car j'ai commencé par crée la classe Test.java pour avoir le fichier
test.h et avec ce fichier et le fichier test.c je crée la dll:
nomProjet.dll.
en pluse je ne vois pas ou je definie la dll rapi.dll, d'aprés toi
elle est nul part ?
merci
0
cs_lak75 Messages postés 71 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 3 avril 2008
11 déc. 2007 à 12:10
salut,
j'espere que tu as compri ma question?
je te remercie pour ton aide car j'ai envi de regler ce pb le plus
vite possible.
0
Rejoignez-nous