Я нашел много ссылок онлайн (включая некоторых на stackoverflow) к JNA, используемому для библиотек C++, но ничто, что я могу найти в документах JNA, не указывает, что это возможно. Кажется, нет никакого способа перенести класс C++, в частности.
Мне нужен собственный доступ для использования RTAudio, но все функции RTAUDIO являются функциями членства класса RTAudio. Таким образом, только для подтверждения JNA не является способом пойти право?
Этот вопрос сводится к тому, чтобы спросить , как вызывать методы экземпляра 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 это не позаботится.
Это не совсем то, что вы просите, но это связано и может быть полезно для достижения той же цели улучшения обработки исключений в вашем приложении.
redgate Exception Hunter http://www.red-gate.com/products/Exception_Hunter/index.htm
Я не использовал этот конкретный продукт, но другие продукты redgate, которые я использовал, были великолепны.
-121--2616294-Это поможет, если будущие деривации также. Если кто-то хочет вывести класс D и иметь виртуальные функции, то его легко понять
-121--2183710-Попробуйте Swig . Он создаст обертки для классов c++ для вас.
Юре прав JNA для доступа к собственным библиотекам. Я думаю, что вам нужен Java - COM Bridge. Если это так, есть несколько свободных альтернатив:
JCOM http://sourceforge.net/projects/jcom
Jacob http://sourceforge.net/projects/jacob-project
Я использовал Jacob в проходе с хорошими результатами, но я думаю, что он немного устарел.