J'ai trouvé de nombreuses références en ligne (y compris certaines sur Stackoverflow) à la JNA étant utilisée pour les bibliothèques C ++, mais rien que je puisse trouver dans la JNA Docs indique que cela est possible. Il ne semble pas y avoir de moyen d'envelopper une classe C ++, en particulier. P>
J'ai besoin d'un accès natif à l'utilisation de RTAUDIO, mais toutes les fonctions de RTAUDIO sont des fonctions membres de la classe RTAUDIO. Donc, juste pour confirmer, la JNA n'est pas la voie à suivre? P>
4 Réponses :
Votre JNA droite est pour accueillir des bibliothèques indigènes. Je pense que ce dont vous avez besoin est un pont Java - Com. Si tel est le cas, il existe quelques alternatives gratuites: P>
jcom http://sourceforge.net/projects/jcom p>
Jacob http://sourceforge.net/projects/jacob-project P >
J'ai utilisé Jacob dans le col avec de bons résultats, mais je pense que c'est un peu obsolète. P>
Qu'est-ce que cette question revient à demander à Comment Appelez les méthodes d'instance C ++ à l'aide de JNA , et c'est possible, mais vous allez devoir faire du travail. En particulier, vous devrez écrire une wrapper que pour toute fonction arbitraire Une solution de contournement simple pour cela serait d'écrire une bibliothèque d'interface C qui appelle simplement la méthode sur les objets pour vous ... Donc, si vous avez une fonction de membre externe "c" code> s toutes les fonctions que vous devez invoquer.
type * () code> Définition Vous pouvez mapper la méthode à l'aide de la JNA comme retournant un
com.sun.jna.pointer code>, mais vous ne pourrez pas appeler des méthodes sur un objet C ++ à partir de la JNA. P>
foo () code> vous pouvez exporter une méthode C de Votre code C ++: p>
extern "C" void bar(type* var){
var->foo();
}
Grande réponse merci. Si un méthode C normal C crée l'instance de classe C ++ à l'intérieur de l'organisme de fonction, appelle la fonction de membre, puis supprime l'objet, puis-je éviter que cette liaison des fonctions des membres directement? Ou la JNA sera-t-elle en quelque sorte "savoir" et rejetera-t-elle ce qui semble être des fonctions c autrement, mais qui utilisent c ++ à l'intérieur de leur corps?
@carteades - besoin de plus d'espace que des commentaires permettent, voir mon édition dans le message.
Merci Mark, cela a fonctionné parfaitement! externe "c" vide rtatéppe (vide) {RTAUDIO :: RTAUDIO AUDIO; STD :: COUT << "Dispositifs numériques:" << Audio.getDevicecount () << STD :: endl; }
Bridj est un enfant spirituel de la JNA qui ajoute un support C ++ limité (+ support complet de Junnerator ). Si vous n'utilisez pas trop de modèles, cela pourrait simplement fonctionner ... p>
(Disclaimer: Je suis l'auteur de Bridj & Jnaerator) em> p>