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
|