Question

Je l'ai trouvé beaucoup de références en ligne (dont certains sur stackoverflow) à la JNA utilisées pour les bibliothèques C ++, mais je ne peux rien trouver dans la documentation de la JNA indique que cela est possible. Il ne semble pas être un moyen d'envelopper une classe C ++, en particulier.

J'ai besoin d'utiliser un accès natif RTAudio, mais toutes les fonctions de RTAudio sont des fonctions membres de la classe RTAudio. Donc, juste pour confirmer, la JNA n'est pas le chemin pour aller à droite?

Était-ce utile?

La solution

Qu'est-ce que cette question revient à se demandent comment appeler les méthodes d'instance C à l'aide de la JNA , et il est possible, mais vous allez devoir faire un peu de travail. En particulier, vous aurez besoin d'écrire un wrapper qui extern "C"s toutes les fonctions dont vous avez besoin en fait d'invoquer.

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.

JNA ne se préoccupe que de la façon dont la méthode est exportée dans la DLL - et qui doit être sans décorations C + (d'où le extern "C"), de sorte que vous pouvez faire tout ce que vous devez à l'intérieur tout cette méthode sans exposer les méthodes que vous appelez.

Dans mon exemple ci-dessus artificiel, cela signifie que foo(), tant qu'il est défini dans la DLL ne pas en fait doivent même être exposés. Comme il est une fonction C ++, la JNA ne peut pas l'appeler directement, mais il peut être appelé à partir d'une fonction qui peut appeler la JNA, ce qui explique pourquoi fonctionne ma solution proposée.

Alors, oui, vous pouvez entièrement encapsuler les appels à toutes les fonctions membres (créer, exploiter, détruire) en une seule fonction et la JNA ne s'occuper.

Autres conseils

Swig. Il va créer des enveloppes pour les classes C ++ pour vous.

BridJ est un enfant spirituel de la JNA qui ajoute un certain soutien de C limité (+ support complet JNAerator ). Si vous n'êtes pas utiliser trop de modèles, il pourrait fonctionner ...

(disclaimer: Je suis l'auteur de BridJ & JNAerator)

Youre JNA droite est pour accesing bibliothèques natives. Je pense que ce dont vous avez besoin est un Java - COM Bridge. Si tel est le cas il y a quelques alternatives libres:

http://sourceforge.net/projects/jcom

http://sourceforge.net/projects/jacob-project

Je l'ai utilisé Jacob dans la passe avec de bons résultats, mais je pense qu'il est un peu obsolète.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top