APPELER DES APIS SANS PROGRAMMATION JNI

Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 - 3 août 2006 à 23:52
cs_didou71 Messages postés 3 Date d'inscription mercredi 27 septembre 2006 Statut Membre Dernière intervention 19 octobre 2006 - 19 oct. 2006 à 13:43
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/38911-appeler-des-apis-sans-programmation-jni

cs_didou71 Messages postés 3 Date d'inscription mercredi 27 septembre 2006 Statut Membre Dernière intervention 19 octobre 2006
19 oct. 2006 à 13:43
un petit tuyau :

http://java.sun.com/docs/books/jni/

charge le zip d'example et sharedStubs de sun, tu trouveras ce qu'il te manque !!

Il suffit de regénérer les fichiers header et de reconstruire la dll.

Bonne continuation
cs_didou71 Messages postés 3 Date d'inscription mercredi 27 septembre 2006 Statut Membre Dernière intervention 19 octobre 2006
4 oct. 2006 à 09:56
pour connaitre le nombre de param pas besoin de la passer :

Jsize a_size = env->GetArrayLength(params) donne la longueur du tableau
cs_didou71 Messages postés 3 Date d'inscription mercredi 27 septembre 2006 Statut Membre Dernière intervention 19 octobre 2006
4 oct. 2006 à 09:24
Sans passer les types, on peut les tester de cette façon, en utilisant la methode instanceof :

par exemple:

if(env->IsInstanceOf(objParam, env->FindClass("java/lang/Integer")) == JNI_TRUE)

pour tester un argument de type integer.

L'idée général est très bonne, mais le code doit murir un peu,vit il encore ce code depuis ??
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
6 août 2006 à 22:46
Salut,

nan il n'y a pas de risque que cela fasse des erreurs si de ton coté tu blinde la chose en plus tu peux aisiaiment le faire en JNI ou alors polus simplement faire un couche d'apstraction java avant de donner cela a bouffer au JNI
DeadlyPredator Messages postés 222 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 30 juin 2008
6 août 2006 à 22:41
Tu veux dire utiliser les fonction de la classe Class pour que mon fonction elle même détermine les types et fasse tout? Si oui, ça pourrais être bien. J'y avais pensé c'est seulement que trop automatisé le processus augmenterait les risques d'erreurs de la part de l'utilisateur.
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
6 août 2006 à 14:12
Salut,

pour les type pourquoi tu n'utilise pas les classe de reflexion et ainsi cela restera completement transparent pour les utilisateurs
DeadlyPredator Messages postés 222 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 30 juin 2008
6 août 2006 à 07:22
oops, je veux dire ou de mauvais types d'argument******
DeadlyPredator Messages postés 222 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 30 juin 2008
6 août 2006 à 05:01
Je rappelle que vous devez vous assurez que jamais la fonction sera appelé avec le mauvais nombre et les bons types d'arguments car cela une telle erreur serait catastrophique. Utilisez seulement des apis avec des paramètres en in :short, string, int et celles qui retroune: void, int, short car string vous retournera un pointeur dont vous ne pourrez vous servir en java... pourquoi java ne supporterait-il pas les pointeurs dans une future version? C'est bon de rêver ...
DeadlyPredator Messages postés 222 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 30 juin 2008
6 août 2006 à 04:52
lol, c étrange mais chez moi, ton startwith ne marche pas. JDK différent?
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
6 août 2006 à 01:53
Merci pour les commentaires et le teste (pas besoin de faire un substr si tu fais un startwith limite fait un toLowerCase ou upper)
DeadlyPredator Messages postés 222 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 30 juin 2008
6 août 2006 à 01:22
J'ai trouvé une bonne utilité à cette fonction, elle pourra servir à un système de plugins natifs car de cette façon les contraintes ne dérangeront pas trop. Pi oui!!! les commentaires sont enfin arrivés dans le code
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
6 août 2006 à 00:55
Salut,

DeadlyPredator merci de prendre en compte mon MP
DeadlyPredator Messages postés 222 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 30 juin 2008
6 août 2006 à 00:33
Attention, je veux dire par là, si vous voulez utiliser des APIs pour vos prog, vous n'aurez pas besoin d'avoir vous mêmes besoin de coder le JNI et vous pourrez tout faire en java. Cependant, et c'est la le gros hic c que on oublie linux pour l'instant, il est impossible d'utiliser des structures encore moins les pointeurs qui vont créer à coup sûre un acces violation. Je me renseigne afin de trouver une façon de tout faire fonctionner mais c'est difficile car le code présente de nombreuses contraintes à cause de java et de la sécurité dans windows.
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
4 août 2006 à 09:23
Salut,

sous linux la gestion des dll ne se fait pas du tout mais vraiment pas comme sous Windows... Donc si tu n'y connais rien à linux arrange toi au moins que si j'utilise ton appli je me pete pas les erreurs de dépendance... exemple:

static {
if(System.getProperty("os.name").startWith("Windos"))
System.loadLibrary("DPsAPICallerLib");
}

et de meme dans le code soit le mieux serait de faire

private native static int callAPI0(String moduleName, String APIName, Object[] parameters, String[] parametersTypes, int nbValues) throws Exception;

public static int callAPI(String moduleName, String APIName, Object[] parameters, String[] parametersTypes, int nbValues) throws Exception{
if(System.getProperty("os.name").startWith("Windos"))
return callAPI0(moduleName, APIName, parameters, parametersTypes, nbValues);
else
return -1;
}


apres pour le code C++ et CStructure.java je ne les lirai qu'une fois les commentaires présent et pense vraiment à les mettres avant toute modifications !!!



Question le nom de ta source "APPELER DES APIS SANS PROGRAMMATION JNI" tu y trouve pas un truc incohérent? tu trouve toi qu'il n'y a pas de JNI ?
DeadlyPredator Messages postés 222 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 30 juin 2008
4 août 2006 à 00:13
Je ne connais rien à linux (mais ca va changé à la fin de mes cours) donc je ne peux pas donner un équivalent en linux. De plus, je ne crois pas que le stack et les dlls fonctionnent de la même façon sous cet os. Je vais essayer de mettre des commentaires dans la source c++.

Message important:
Les pointeurs ne sont pas supportés donc les paramètres OUT ne marcheront pas. Je vais étudier ça et donner la solution bientot. C'est sur ma TODO list avec les structures, les autres conventions d'appel et les commentaires. Et j'oubliais, utiliser seulement des apis avec la convention d'appel _stdcall car utiliser _cdecl ferait planté le programme car je n'ai pas encore placé le code pour décalé ESP à la fin. Même chose pour _fastcall.
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
3 août 2006 à 23:52
Salut,

merci de mettre des commentaires dans le code en C++ et de faire un contrôle sur l'OS dans le code java pour ne pas faire d'appel à la DLL ou alors met l'equivalent linux !