jan san kar profil : pas le bon | 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 :
 - JNIEXPORT jstring JNICALL Java_RasterDAO_getRaster(JNIEnv *penv, jobject obj, jint id_grille, jint id_colormap) {
 - 	void* librairie;
 - 	char* (*getRaster)(int, int);
 - 	//dlopen("libgd.so",RTLD_NOW);
 - 	librairie = dlopen("libprojetXdb.so",RTLD_NOW);
 - 	if (librairie == NULL) {
 -   printf("erreur dlopen libprojetXdb.so : %s\n", dlerror());
 -   exit (-1);
 - 	}
 - 	getRaster = (char* (*) (int, int)) dlsym(librairie, "getRaster" );
 - 	if (getRaster == NULL) {
 -   printf("erreur dlsym getRasterById : %s\n", dlerror());
 -   exit (-1);
 - 	}
 - 	char* fichierpng = getRaster(id_grille, id_colormap);
 - 	dlclose(librairie);
 - 	return penv->NewStringUTF(fichierpng);
 - }
 
  |  
    Message édité par jan san kar le 05-07-2007 à 21:28:43
  |