9
votes

Java Native Access ne fait pas C ++, non?

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.

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?


0 commentaires

4 Réponses :


1
votes

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:

jcom http://sourceforge.net/projects/jcom

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

J'ai utilisé Jacob dans le col avec de bons résultats, mais je pense que c'est un peu obsolète.


0 commentaires

3
votes

Essayez Swig . Il créera des emballages pour les cours C ++ pour vous.


0 commentaires

16
votes

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 externe "c" code> s toutes les fonctions que vous devez invoquer.

pour toute fonction arbitraire 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>

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 foo () code> vous pouvez exporter une méthode C de Votre code C ++: p>

extern "C" void bar(type* var){
   var->foo();
}


3 commentaires

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; }



3
votes

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 ...

(Disclaimer: Je suis l'auteur de Bridj & Jnaerator)


0 commentaires