Salut à tous !
J'ai bossé sur un petit projet sympa autour du jeu Wakfu. (Oui, le titre est un peu putaclic :p)
Alors, pour ceux qui ne savent pas, Wakfu tourne en Java, ce qui permet de faire pas mal de choses, notamment dans la manipulation de l'application (l'application Java, bien sûr) grâce au JNI.
Mais c'est quoi le JNI ? Eh bien, pour faire simple, cela permet d'exécuter du code C/C++ directement dans une application Java en cours d'exécution.
Alors, comment ça marche :
class_ptr = p_env->FindClass("aYA");
jfieldID class_instance_field_id = p_env->GetStaticFieldID(class_ptr, "d", "LaYA;");
class_instance = p_env->GetStaticObjectField(class_ptr, class_instance_field_id);
Premièrement, p_env est ce qui fait le pont entre le code C++ et Java (JNIEnv), et il est directement fourni dans Java.
Mais alors, que fait ce code ?
- p_env->FindClass("aYA") cherche la classe Java "aYA" dans le jeu. Malheureusement, Wakfu est obfusqué, ce qui donne ces noms bizarres à la classe. "aYA" correspond à "WakfuGameEntity".
- p_env->GetStaticFieldID(class_ptr, "d", "LaYA;") récupère l'identifiant du champ statique "d" de cette classe. Encore une fois, "d" est le nom de la variable qui est normalement "m_instance". Et "LaYA;" ? En fait, c'est simplement le type de la variable. Ça pourrait être I pour int, mais là le champ est une classe, donc il faut simplement commencer par un "L" suivi du nom de la classe et enfin d'un point-virgule "LClassName;".
- p_env->GetStaticObjectField(class_ptr, class_instance_field_id) récupère enfin l'instance de la classe à l'aide de l'identifiant du champ statique.
C'est bien, mais comment ai-je su que "aYA" était cette classe et pareil pour le nom de la variable ? Simple, le code n'a pas toujours été comme ça, donc il suffit d'avoir une version non obfusquée et de chercher un peu.
Je pourrais encore donner des exemples, mais le principe est là. Dans l'exemple, j'ai l'objet WakfuGameEntity qui permet ensuite de tout faire. Il y a par exemple une fonction getLocalPlayer() qui permet d'avoir le personnage sélectionné. Et après, avec cet objet personnage qui dispose d'une fonction moveTo, je pourrais appeler cette fonction pour le déplacer. Enfin bref, tout est possible, mais voici un exemple, ce sera plus parlant.
https://www.youtube.com/watch?v=99u_XQiFkLs
Merci de m'avoir lu,
PS: si des gens veulent le code je le partagerais