JNI Utiliser une connection Java dans une dll C/C++

JNI Utiliser une connection Java dans une dll C/C++ - Java - Programmation

Marsh Posté le 04-11-2002 à 13:59:27    

Bon, pour des raisons que j'ai pas bien le temps d'expliquer, voila ce que j'aurais besoin defaire :
J'ai une appli Java qui à initialisé une connection JDBC.
Cette appli Java utilisera JNI pour déléguer une partie du boulot qu'elle a à faire à une DLL écrite en C. Cette dll C doit absolument aller chercher elle même des données dans une base de données. D'ou ma question :  
- Est-il possible de passer en paramètre l'objet de type java.sql.Connection représentant ma connection Java ? (logiquement, oui)
- Mais surtout, est ce que ça serait très lourd à gérer, nottament pour la récupération de données, comment exploiter un Statement, un ResultSet via JNI (dans la dll quoi !) ?
 
Je rêve là ou pas ? C possible ça ?

Reply

Marsh Posté le 04-11-2002 à 13:59:27   

Reply

Marsh Posté le 04-11-2002 à 14:01:47    

et tu es sur que ca en vaut la peine?
 
Idée: modifier le programme C pour qu'il traite le resultset à ta place ... Mais bon pour la connection, ca m'étoonerait TRES fort. Et à y réfléchir c'est même impossible ...


Message édité par darklord le 04-11-2002 à 14:02:20

---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 04-11-2002 à 14:03:41    

DarkLord a écrit a écrit :

et tu es sur que ca en vaut la peine?
 
Idée: modifier le programme C pour qu'il traite le resultset à ta place ... Mais bon pour la connection, ca m'étoonerait TRES fort. Et à y réfléchir c'est même impossible ...




 
Comment ça qu'il traite le ResultSet à ma place ?

Reply

Marsh Posté le 04-11-2002 à 14:06:54    

bin qu'il te renvoie des données formatées (un tableau de brol ou que sais je). Mais oublie pour ta connection hein :o Utiliser une connection (qui je le rappelle est dépendante du driver Java de ta DB) Java dans un prog C j'ai du mal à imaginer que ce soit possible ...


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 04-11-2002 à 14:13:02    

Ms le problème c'est que cette Dll existe déja. Elle est actuellement utilisée dans des programmes C++.
Le but serait que ma web-app utilise aussi cette dll.
Ms cette dll, dans son fonctionnement "normal" utilise une connection Odbc pour aller chercher toutes sortes d'infos en BD dont elle à besoin en interne pour pouvoir faire son job.
J'ai pas compris les raisons que tu donnes à propos de l'inutilisabilité d'un objet Connection java pour récupérer des données dans un prog C++ via JNI...

Reply

Marsh Posté le 04-11-2002 à 14:19:12    

bin Connection c'est une interface. Lorsque tu fais un forName de ton driver (oracle ou autre) il déclare l'api qui va etre utilsée pour accéder à la BD. Donc lorsque tu demandes une connection tu récupères une implémentation de Connection pour ta BD.  
 
Conceptuellement parlant, je vois mal (mais je peux me tromper) comment ce genre d'objet pourrait etre utilisable par ta DLL. J'ose imaginer que JNI s'occupe de transformer les objets Java en truc compréhensible par ta DLL C++ ou un mécanisme du genre ...
 
Mais bon une connection JDBC, j'ai plus qu'un doute


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 04-11-2002 à 14:25:21    

Moi j'imaginait que les objetc Java restaient les même de toute façon, et que JNI permettait juste de "piloter" un objet passé en paramètre, en permettant d'utiliser ses méthodes et attributs publics.
J'éspère que j'me trompe pas. Si c le cas, qqch est possible...

Reply

Marsh Posté le 04-11-2002 à 14:33:40    

El_Gringo a écrit a écrit :

Bon, pour des raisons que j'ai pas bien le temps d'expliquer, voila ce que j'aurais besoin defaire :
J'ai une appli Java qui à initialisé une connection JDBC.
Cette appli Java utilisera JNI pour déléguer une partie du boulot qu'elle a à faire à une DLL écrite en C. Cette dll C doit absolument aller chercher elle même des données dans une base de données. D'ou ma question :  
- Est-il possible de passer en paramètre l'objet de type java.sql.Connection représentant ma connection Java ? (logiquement, oui)
- Mais surtout, est ce que ça serait très lourd à gérer, nottament pour la récupération de données, comment exploiter un Statement, un ResultSet via JNI (dans la dll quoi !) ?
 
Je rêve là ou pas ? C possible ça ?




La réponse est oui aux 2 questions. Le truc, c'est que tu vas vite trouver cela très lourd à programmer. Par exemple, si tu as un objet Connection et que tu veux exécuter la méthode Statement createStatement(int resultSetType, int resultSetConcurrency), tu dois écrire :

Code :
  1. jclass     connectionClass       = jniEnv->getObjectClass(connection);
  2. jmethodID  createStatementMethod = jniEnv->getMethodID(connectionClass, "createStatement", "(II)Ljava.sql.Statement;" );
  3. if (jniEnv->ExceptionOccurred()) {
  4.    // Erreur : quitter le JNI et laisser l'exception se propager.
  5.    return;
  6. }
  7. jobject  statement = jniEnv->CallObjectMethod(connection, createStatementMethod,
  8.                                               (jint) resultSetType, (jint) resultSetConcurrency);


Reply

Marsh Posté le 04-11-2002 à 14:48:35    

>>> Désolé d'avoir induit en erreur. Je suis vraiment étonné de ce que JNI est capable de faire (meme si c'est lourd) ...
 
 :jap:


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 04-11-2002 à 14:55:29    

BifaceMcLeOD a écrit a écrit :

 
La réponse est oui aux 2 questions. Le truc, c'est que tu vas vite trouver cela très lourd à programmer. Par exemple, si tu as un objet Connection et que tu veux exécuter la méthode Statement createStatement(int resultSetType, int resultSetConcurrency), tu dois écrire :

Code :
  1. jclass     connectionClass       = jniEnv->getObjectClass(connection);
  2. jmethodID  createStatementMethod = jniEnv->getMethodID(connectionClass, "createStatement", "(II)Ljava.sql.Statement;" );
  3. if (jniEnv->ExceptionOccurred()) {
  4.    // Erreur : quitter le JNI et laisser l'exception se propager.
  5.    return;
  6. }
  7. jobject  statement = jniEnv->CallObjectMethod(connection, createStatementMethod,
  8.                                               (jint) resultSetType, (jint) resultSetConcurrency);


 




 
Génial...
Bon, j'vais m'y mettre à JNI alors.
Biface et les autres qui connaissent JNI, restez à portée de clavier, j'risque d'avoir besoin de vous :D
Merci...

Reply

Marsh Posté le 04-11-2002 à 14:55:29   

Reply

Marsh Posté le 04-11-2002 à 14:56:57    

DarkLord a écrit a écrit :

>>> Désolé d'avoir induit en erreur. Je suis vraiment étonné de ce que JNI est capable de faire (meme si c'est lourd) ...
 
 :jap:  




 
Y a pas d'mal, ça peut arriver.
Juste, t'as la chance de pas avoir en face de toi qqn avec un caractère de chiotte qui en profite pour t'en mettre plein la tête !  :D

Reply

Marsh Posté le 04-11-2002 à 16:45:57    

BifaceMcLeOD a écrit a écrit :

 
La réponse est oui aux 2 questions....  




 
biface  :hello:  
 
Une remarque (pas pour toi biface, je sais que tu sais...), quand meme, c'est lourd a gerer, c'est sujet aux erreurs, c'est lent.
 
En general on reserve ce genre de callback pour des cas exceptionnels (creation d'une exception, logging d'un message...).
 
De plus ca ne va pas te remplacer directement ta connection ODBC.
 
Renaud

Reply

Marsh Posté le 04-11-2002 à 17:23:54    

Renaud  :hello:  :jap:

Reply

Marsh Posté le 05-11-2002 à 09:45:27    

- Renaud - a écrit a écrit :

 
 
biface  :hello:  
 
Une remarque (pas pour toi biface, je sais que tu sais...), quand meme, c'est lourd a gerer, c'est sujet aux erreurs, c'est lent.
 
En general on reserve ce genre de callback pour des cas exceptionnels (creation d'une exception, logging d'un message...).
 
De plus ca ne va pas te remplacer directement ta connection ODBC.
 
Renaud




 
J'aurais peut être une disaine de requète à effectuer, maxi, chacune rendant un seul résultat. Tu crois que c beaucoup trop lourd ?
Comment ça ça remplacera pas ma connection ODBC ?
  Je me doute bien que ça va pas marcher sans changer le code, ms si ça me permet d'exécuter des requêtes SQL et de Récupérer les résultats, ça remplace ma connection ODBC. Sinon j'vois pas l'intéret !

Reply

Marsh Posté le 05-11-2002 à 10:01:15    

mais si tu as si peu de trucs pourquoi te casser la tête :??: ca te prendra dix fois moins de temps de recoder ca en java que de jouer avec JNI avec ton truc tout fait ...
 
Enfin moi ce que j'en dit ...


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 05-11-2002 à 10:04:44    

DarkLord a raison. D'autant qu'après, le code JNI, il faut le maintenir, et de mon expérience, le coût de maintenance d'une ligne de JNI est 10 fois plus important que celui d'une ligne Java (c'est un ordre de grandeur), même s'il a été codé très proprement au départ (parce que si le programmeur a codé ça comme un porc, c'est 50 fois plus...).

Reply

Marsh Posté le 05-11-2002 à 10:51:08    

Ben, y a relativement peu d'accès au BD, mais ceux-ci sont utilisés pour initialiser des objets qui, eux sont relativement complexes, et, à mon avis, pas si simple que ça à recoder.
D'autant plus qu'après avior été initialisés, ces objets sont utilisés dans un moteur graphique (ma dll) qui, lui, est carrément impossible à refaire en Java...

Reply

Marsh Posté le 05-11-2002 à 11:21:08    

si les objets sont complexes et que tu veux les faire passer à ton prog java, ca va etre galère


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 05-11-2002 à 12:32:56    

DarkLord a écrit a écrit :

si les objets sont complexes et que tu veux les faire passer à ton prog java, ca va etre galère




 
Justement, j'éspère ne pas avoir à les passer à mon code Java.
Cette dll générère et utilise toute seule comme une grande ces objets complexes. Avec ceux-ci, elle me génére une image, dès lors toute simple à utiliser (forcément )
Moi seul pb (et surement pas des miondres), c'est que cette dll à besoin d'aller chercher 2, 3 trucs en BD...
Un peu trop nombreux qd même pour pouvoir tout lui passer en paramètres...

Reply

Marsh Posté le 05-11-2002 à 14:03:06    

et pq pas. Moi je dis passage de paramètre powa :sol:


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 05-11-2002 à 15:16:12    

DarkLord a écrit a écrit :

et pq pas. Moi je dis passage de paramètre powa :sol:




 
T'as peut être raison, mais ça me fait chercher en bd des trucs peut être pas nécessaire...

Reply

Marsh Posté le 05-11-2002 à 15:17:19    

il faut etre pragmatique parfois ...


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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