Собственный Доступ Java не делает C++, правильно?

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

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

8
задан Yuvi Masory 11 February 2010 в 06:25
поделиться

3 ответа

Этот вопрос сводится к тому, чтобы спросить , как вызывать методы экземпляра 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 это не позаботится.

13
ответ дан 5 December 2019 в 08:52
поделиться

Это не совсем то, что вы просите, но это связано и может быть полезно для достижения той же цели улучшения обработки исключений в вашем приложении.

redgate Exception Hunter http://www.red-gate.com/products/Exception_Hunter/index.htm

Я не использовал этот конкретный продукт, но другие продукты redgate, которые я использовал, были великолепны.

-121--2616294-

Это поможет, если будущие деривации также. Если кто-то хочет вывести класс D и иметь виртуальные функции, то его легко понять

-121--2183710-

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

3
ответ дан 5 December 2019 в 08:52
поделиться

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

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

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

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

1
ответ дан 5 December 2019 в 08:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: