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

chargement de librairies C++ [JNI][résolu] - Java - Programmation

Marsh Posté le 05-07-2007 à 11:41:05    

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
Reply

Marsh Posté le 05-07-2007 à 11:41:05   

Reply

Marsh Posté le 05-07-2007 à 17:12:30    

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
Reply

Marsh Posté le 05-07-2007 à 21:28:21    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed