Доступ к сторонней DLL с использованием JNA

Я пытаюсь получить доступ к сторонней С++ DLL, используя JNA. Я просмотрел доступную документацию JNA и некоторый блог для понимания JNA.

Но теперь я застрял с проблемой. В DLL, которая у меня есть, есть несколько классов. И функции определены внутри классов. Итак, существует иерархия. Как я могу получить доступ к функциям тогда?

Например, у меня есть DLL с именем: «abc.dll». В этой dll у меня есть класс «pqrs», и в этом классе есть функция с именем xyz(). Я хочу получить доступ к функции xyz().

До сих пор я могу успешно загрузить abc.dll следующим образом:

abc abcDLL = (abc) Native.loadLibrary("abc", abc.class);

Я создал такой интерфейс:

public interface abc extends Library {
    void xyz();  // this is wrong because "xyz" is not directly "abc.dll" but inside the class "pqrs" which is inside abc.dll
}

И так внутри dll есть несколько классов. Я много искал в Интернете об этом. Но не смог найти решение. Я наткнулся на эти сообщения:

Но там никто не ответил.


person Abhi    schedule 15.11.2013    source источник
comment
Если это не сделано правильно, что обычно не так, экспорт классов через границы DLL обычно приводит к головной боли. Пожалуйста, покажите нам хотя бы некоторые искаженные имена соответствующих экспортов из DLL, которые могут хотя бы дать нам представление о том, как была построена DLL. Также, пожалуйста, покажите некоторые из вещей, которые вы пробовали до сих пор.   -  person Jason C    schedule 16.11.2013
comment
Спасибо, Джейсон, за ответ. Подробности смотрите в моем отредактированном посте. Извините, но я не могу раскрыть оригинальные названия dll и функций. Я использовал псевдоним для них. Это должно служить цели. Пожалуйста, дайте мне знать, если вам нужно что-нибудь еще.   -  person Abhi    schedule 16.11.2013
comment
Итак, имя экспорта — abc, совершенно неискаженное, вот так? Например, не ?Foo@CXyz@@QAEHH@Z (как в codeproject.com/Articles/28969/)? Причина в том, что схема изменения имен C++ нестандартизирована, и если она используется в вашем экспорте DLL (что, скорее всего, так и есть), то у вас очень мало шансов получить надежный доступ даже к членам, не относящимся к классу. В нынешнем виде, с предоставленной информацией, короткий ответ таков: вы не можете сделать это, если только классы в DLL не были специально разработаны для использования с JNI.   -  person Jason C    schedule 16.11.2013
comment
Одним из возможных вариантов является написание совместимой с JNI DLL-оболочки на C++, которая инкапсулирует некоторые высокоуровневые функции или, по крайней мере, предоставляет заглушки, которые действуют как интерфейс-мост к вашей сторонней DLL. Тогда ваше Java-приложение может вместо этого использовать эту DLL.   -  person Jason C    schedule 16.11.2013
comment
Похоже на работу для JavaCPP :)   -  person Samuel Audet    schedule 04.12.2013