Java Native Access ne pas le faire en C++, non?
J'ai trouvé de nombreuses références en ligne (y compris certaines sur stackoverflow) à JNA être utilisé pour les bibliothèques C++, mais je ne peux rien trouver dans la JNA docs indique que c'est possible. Il ne semble pas être en aucune façon à l'envelopper d'une classe C++, en particulier.
J'ai besoin d'un accès natif à utiliser RTAudio, mais tout de RTAudio fonctions sont des fonctions de membre de la RTAudio classe. Donc, juste pour confirmer, JNA n'est pas la voie pour aller à droite?
OriginalL'auteur Yuvi Masory | 2010-02-11
Vous devez vous connecter pour publier un commentaire.
Ce que cette question revient à se demander comment appeler C++ méthodes d'instance à l'aide de la "JNA", et il est possible, mais vous allez avoir à faire un peu de travail. En particulier, vous aurez besoin de rédiger un wrapper qui
extern "C"
s toutes les fonctions dont vous avez réellement besoin de l'invoquer.Pour tout arbitraire
type* function()
définition, vous pouvez mapper la méthode à l'aide de la " JNA " comme retournant uncom.sun.jna.Pointer
, mais vous ne serez pas en mesure d'invoquer des méthodes sur un objet C++ à partir de JNA.Une solution simple serait d'écrire une interface C de la bibliothèque qui appelle simplement la méthode sur les objets pour vous...donc si vous avez des membres de la fonction
foo()
vous pouvez exporter un C méthode à partir de votre code C++:Évidemment, cela va ajouter un peu de travail pour vous...mais je soupçonne que la surcharge de commutation à JNI serait sensiblement le même.
JNA se soucie uniquement de la façon dont la méthode est exporté dans le DLL -- et qui doit être sans C++ décorations (d'où le
extern "C"
), de sorte que vous pouvez faire ce que vous avez besoin à l'intérieur de la méthode, sans exposer les méthodes que vous appelez.Dans mon artificiel exemple ci-dessus, cela signifie que
foo()
, tant qu'il est défini dans la DLL n'est pas dans le fait même d'être exposés. Puisque c'est une fonction C++, JNA ne peut pas l'appeler directement, mais il peut être appelé à partir d'une fonction qui JNA peut appeler, c'est pourquoi ma proposition de solution qui fonctionne.Donc, oui, vous pouvez encapsuler les appels à toutes les fonctions de membre (créer, d'exploiter, détruire) dans une seule fonction et de la JNA ne sera pas un souci.
besoin de plus d'espace que les commentaires, voir mon edit dans le post.
Merci Mark, il a parfaitement fonctionné! extern "C" void rtattempt(void) { RtAudio::RtAudio audio; std::cout << "num appareils:" << audio.getDeviceCount() << std::endl; }
OriginalL'auteur Mark Elliot
Essayer Swig. Il permettra de créer des wrappers pour les classes c++ pour vous.
OriginalL'auteur Denis Tulskiy
BridJ est un enfant spirituel de la JNA qui ajoute un peu limité support du C++ (+ le plein soutien de l' JNAerator). Si vous n'êtes pas trop à l'aide de nombreux modèles, il est possible que ça fonctionne...
(disclaimer: je suis l'auteur de BridJ & JNAerator)
OriginalL'auteur zOlive
Vous êtes en droit de la JNA est pour l'accès aux bibliothèques natives. Je pense que ce que vous avez besoin est un Java - COM Pont. Si c'est le cas il y a quelques alternatives libres:
JCOM http://sourceforge.net/projects/jcom
Jacob http://sourceforge.net/projects/jacob-project
J'ai utilisé Jacob dans le pass avec de bons résultats, mais je pense que c'est un peu désuet.
OriginalL'auteur Alonso