Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
771 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  [JNI][résolu] chargement de librairies C++

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[JNI][résolu] chargement de librairies C++

n°1582759
jan san ka​r
profil : pas le bon
Posté le 05-07-2007 à 11:41:05  profilanswer
 

Bonjour,
en ce moment je fais un peu de JNI pour faire de la génération d'image à partir d'une base de données (plus quelques calculs statistiques)
Les performances en java étant clairement horrible pour ces tâches (rapport quasi de 10 comparé à C ou C++) je suis en train de mettre en place une API C à laquelle j'accède par JNI.
On peut représenter l'application comme suit :
 
TOMCAT                |
------------------------                        
   appli web             |                        
   + classe "JNI"     |---------------> libGrille.so -------------------------> libprojetXbd.so
                                |       implémentant les fonctions natives
 
libGrille.so permet juste de modifier les parametres reçues des objets java et les transmets à la lib obtenant les données et générant les images. Il y a deux lib car plusieurs personnes utilisent libprojetXdb.so et ils n'ont aucune raison de manipuler ma libGrille.so.
 
Le soucis est que libprojetXdb.so a besoin de gd pour créer ses images (enfin je pense car je ne sais pas vraiment le rôle de gd) et lorsque j'execute mon code java j'obtiens un joli :
erreur dlopen libprojetXdb.so : /home/jansankar/projet/projetX/lib/libprojetXdb.so: undefined symbol: gdImageColorAllocate
donc j'ai l'habitude d'avoir des library not found machin que je résous à coup de -Djava.library.path
sauf que la c'est une erreur C++ un peu génante car de base si j'avais un programme tout en C++ je le résous avec un -lgd lors de ma compil sauf que la je fais une lib donc je n'ai pas d'édition de lien.
 
voici la tête de ma ligne de compilation
g++ -shared -Wno-deprecated -fPIC -o libRasterDAO.so -I/usr/local/j2sdk/include/ RasterDAO.cpp
 
et pour idée une partie du code ma classe C++ :

Code :
  1. JNIEXPORT jstring JNICALL Java_RasterDAO_getRaster(JNIEnv *penv, jobject obj, jint id_grille, jint id_colormap) {
  2. void* librairie;
  3. char* (*getRaster)(int, int);
  4. //dlopen("libgd.so",RTLD_NOW);
  5. librairie = dlopen("libprojetXdb.so",RTLD_NOW);
  6. if (librairie == NULL) {
  7.  printf("erreur dlopen libprojetXdb.so : %s\n", dlerror());
  8.  exit (-1);
  9. }
  10. getRaster = (char* (*) (int, int)) dlsym(librairie, "getRaster" );
  11. if (getRaster == NULL) {
  12.  printf("erreur dlsym getRasterById : %s\n", dlerror());
  13.  exit (-1);
  14. }
  15. char* fichierpng = getRaster(id_grille, id_colormap);
  16. dlclose(librairie);
  17. return penv->NewStringUTF(fichierpng);
  18. }


Message édité par jan san kar le 05-07-2007 à 21:28:43
mood
Publicité
Posté le 05-07-2007 à 11:41:05  profilanswer
 

n°1582907
jan san ka​r
profil : pas le bon
Posté le 05-07-2007 à 17:12:30  profilanswer
 

donc pour que ça marche avant le dlopen de libprojet il faut ajouter :
dlopen("libgd.so",RTLD_NOW|RTLD_GLOBAL)

 

bon maintenant c'est tomcat qui me soule car en local ça marche niquel (en lançant un main() à la main) mais avec tomcat j'obtiens un joli :
java.lang.UnsatisfiedLinkError: org/xxx/persistance/jni/RasterDAO.getRaster
ça commence à me courrir cette histoire :/


Message édité par jan san kar le 05-07-2007 à 17:12:47
n°1583010
jan san ka​r
profil : pas le bon
Posté le 05-07-2007 à 21:28:21  profilanswer
 

re :
donc il faut avoir le LD_LIBRARY_PATH et java.library.path qui pointe sur le .so et penser à coller la classe qui charge la librairie dans le $TOMCAT_HOME/shared/lib


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  [JNI][résolu] chargement de librairies C++

 

Sujets relatifs
Problème affichage sous IE [RESOLU]expression régulière [nouveau problème]
[Resolu]extraire un lecteur flv embeddeddatagridviewComboboxColumn et chargement depuis BDD
Precharger des librairies dans le cache[RESOLU] [AS] du mal a démarrer
[RÉSOLU] Aide pour une requete MySQL[RESOLU] Une liste de pays dans ma base de données SQL
[résolu]Une balise script qui empêche tout affichage dans IE[resolu][TRIGGER] Insert
Plus de sujets relatifs à : [JNI][résolu] chargement de librairies C++


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR