JNA - appeler des méthodes sur l'instance de C repassée de DLL
Question
Dire que j'ai un C ++ DLL avec une seule méthode exportée comme:
CustomerProcessor* getInstance();
i.e.. il retourne simplement une instance de la classe qui contient en fait les méthodes que je dois appeler.
Je sais que je peux mapper la méthode getInstance () à une classe en Java à l'aide de la JNA (extension com.sun.jna.Library), stocker l'instance CustomerProcessor retourné dans un com.sun.jna.Pointer.
Puis-je alors la carte en quelque sorte ce à la classe CustomerProcessor pour que je puisse appeler des méthodes sur (et si oui, comment)?
La solution
Pour toute définition arbitraire type* function()
vous pouvez mapper la méthode utilisant la JNA comme un retour com.sun.jna.Pointer
, mais vous ne serez pas en mesure d'invoquer des méthodes sur un objet de C de la JNA de.
Une solution simple pour ce serait d'écrire une bibliothèque d'interface C qui invoque simplement la méthode sur les objets pour vous ... donc si vous avez une fonction de membre foo()
, vous pouvez exporter une méthode C à partir de votre code C ++:
extern "C" void bar(type* var){
var->foo();
}
Il est évident que cela va ajouter un peu de travail pour vous ... mais je soupçonne que les frais généraux pour le passage à JNI serait à peu près le même.
Autres conseils
JNAerator peut faire ce que vous facilitent la demandez. Il a un certain soutien pour demangling et l'accès vtable (requis pour appeler * ces méthodes).