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