Appeler des apis sans programmation jni

Soyez le premier à donner votre avis sur cette source.

Vue 8 689 fois - Téléchargée 720 fois

Description

Ce code permet d'appeler une API windows, seulement en appelant une seule fonction que j'ai créé en JNI. Son utilisation est assez simple quoique un peu délicate. Ne supporte pas encore les structures mais à venir.

Conclusion :


Ce code résume tout:
try {
Object[] params = {new Integer(0), "allo", "xxx", new Integer(3)};
String[] types = {"int", "string", "string", "int"};
System.out.println(DPsAPICaller.callAPI("User32.dll", "MessageBoxA", params, types, 4));
} catch (Exception e) {
e.printStackTrace();
}

La fonction doit être dans un try. Vous devez
1- créé un tableau D'OBJECTS contenant CHAQUE paramètre
2- créé un tableau de STRINGS contenant le type de chaque paramètres en minuscule
vous pouvez aussi passez un pointeur 32bits avec le type ptr. j'ai ajouter cela car je vais faire une source qui va créer des structures dans la mémoire et donner leur pointeur car bien des apis marchent avec des structures.
3- appeler DPsAPICaller.callAPI avec chaque paramètre ET INDIQUEZ VOUS MÊME LE NOMBRE DE PARAMÈTRES. Le tableau peut contenir plus de paramètres que le nombre indiqué.

Les types suivant sont à tester car ils sont en warning:
char
byte
boolean

Il est possible qu'il faut les passer en autre chose avec l'assembleur

byte n'est pas encore implenté

ATTENTION!!! SI JAMAIS VOUS NE DONNEZ PAS LE BON NOMBRE DE PARAMÈTRES POUR L'API, LE STACK NE VA PAS AIMEZ ÇA ET CELA VA CRÉER UN CRASH DU PROGRAMME.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_didou71
Messages postés
3
Date d'inscription
mercredi 27 septembre 2006
Statut
Membre
Dernière intervention
19 octobre 2006

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

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

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
5341
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
10 décembre 2019
89
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

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.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.