Собственный доступ Java не делает C ++, правильно? - PullRequest
8 голосов
/ 11 февраля 2010

В Интернете я нашел много ссылок (в том числе на stackoverflow) на использование JNA для библиотек C ++, но ничего, что я могу найти в документации JNA, не указывает на то, что это возможно. Кажется, нет никакого способа обернуть класс C ++, в частности.

Мне нужен собственный доступ для использования RTAudio, но все функции RTAudio являются функциями-членами класса RTAudio. Так что просто для того, чтобы подтвердить, что JNA - это не тот путь, по которому надо идти?

Ответы [ 4 ]

13 голосов
/ 11 февраля 2010

Что означает этот вопрос: , как вызывать методы экземпляра C ++ с использованием JNA , и это возможно, но вам придется проделать определенную работу. В частности, вам нужно написать оболочку, которая extern "C" будет иметь любые функции, которые вам действительно нужно вызывать.

Для любого произвольного определения type* function() вы можете отобразить метод с использованием JNA как возвращающий com.sun.jna.Pointer, но вы не сможете вызывать методы объекта C ++ из JNA.

Простой обходной путь для этого - написать библиотеку интерфейса C, которая просто вызывает метод для объектов для вас ... поэтому, если у вас есть какая-либо функция-член foo(), вы можете экспортировать метод C из своего кода C ++:

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

Очевидно, это добавит вам работы ... но я подозреваю, что затраты на переключение на JNI будут примерно такими же.

JNA заботится только о том, как метод экспортируется в DLL - и это должно быть без C ++ декораций (отсюда extern "C"), так что вы можете делать все, что вам нужно в пределах любой такой метод без раскрытия методов, которые вы вызываете.

В моем надуманном примере выше это означает, что foo(), пока оно определено в DLL, фактически даже не должно быть открыто. Поскольку это функция C ++, JNA не может вызывать ее напрямую, но ее можно вызывать из функции, которую может вызвать JNA, поэтому мое предлагаемое решение работает.

Итак, да, вы можете полностью инкапсулировать вызовы всех функций-членов (создавать, управлять, уничтожать) в одной функции, и JNA не будет заботиться.

3 голосов
/ 11 февраля 2010

Попробуйте Swig . Он создаст обертки для классов C ++ для вас.

2 голосов
/ 19 февраля 2013

BridJ является духовным потомком JNA, который добавляет ограниченную поддержку C ++ (+ полная поддержка от JNAerator ). Если вы не используете слишком много шаблонов, это может сработать ...

(отказ от ответственности: я автор BridJ & JNAerator)

1 голос
/ 11 февраля 2010

Вы правы, JNA для доступа к нативным библиотекам. Я думаю, что вам нужен Java - COM Bridge. Если это так, есть несколько бесплатных альтернатив:

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

Джейкоб http://sourceforge.net/projects/jacob-project

Я использовал Джейкоба на пасе с хорошими результатами, но я думаю, что он немного устаревший.

...