У меня была аналогичная проблема несколько лет назад. У меня была dll, написанная в Delphi. (Delphi - инструмент разработки приложений для Windows, основанный на Паскале, продаваемый Borland.) Мне нужно было вызвать DLL из Java, но некоторые из функций dll имели параметры и возвращали типы, которые были несовместимы с Java. (Как интересный, если неважно, в стороне, Андерс Хейлсберг, который изобрел C# для Microsoft, также изобрел Delphi для Borland.) Вот как я решил проблему.
1) Я использовал jni, чтобы позволить Java-коду вызвать DLL.
2) Я написал тонкую оболочку dll в Delphi, которая была фактической dll, вызванной моим jni-кодом Java. Для тех функций, которые были полностью совместимы с Java, dll-оболочка просто выступала в качестве прохода, хотя напрямую вызывала фактические функции dll и возвращала возвращаемое значение. Для тех функций, которые были несовместимы, dll-оболочка определяла соответствующие методы, которые были совместимы с Java, и выполнял соответствующий перевод с Java на Delphi, прежде чем вызывать фактическую dll.
3) Я также написал тонкий оберточный объект над моими звонками jni. Опять же, по большей части, java-обертка непосредственно создавала jni-вызовы для тех функций, которые были полностью совместимы между Java и Delphi. Однако, в моем случае, некоторые функции требовали, чтобы я проходил в Delphi-объекты. Итак, что я сделал, это определить соответствующие объекты Java. Основная цель моего объекта оболочки Java заключалась в том, чтобы взять эти объекты Java, перевести их в параметры, которые были совместимы с моей DLL-оболочкой Delphi, а затем сделать подходящий jni-вызов. Кроме того, для тех функций dll, которые передавали объект назад, моя оболочка java приняла java-совместимое возвращаемое значение из jni-вызова и создала и смоделировала соответствующий объект.
Это может показаться большой работой, но на самом деле это не так (и у моей dll было более 100 методов и дюжина типов объектов Delphi). Когда я закончил, написав код приложения Java, который фактически использовал DLL, был очень прост.
Что касается дженериков, это может быть проблемой. Но, если в реальной жизни количество поддерживаемых типов объектов относительно невелико (и это часто бывает), вы можете просто написать отдельные вызовы для каждого типа объекта в вашей обертке. (Это то, что те из нас, кто помнил Java 2, раньше делали придумывание дженериков, и он работал отлично, даже если он был немного менее изящным.) В вашем приложении Java-код мог использовать дженерики; обертка сделает соответствующий вызов на основе фактического типа, который был передан.
Надеюсь, это даст вам несколько идей о том, как вы можете продолжить.
объяснил Ну, это подобно моему собственному опыту, соединяющему между Delphi и Java. Я также использовал [JNA] (https://github.com/twall/jna) для соединения между DLL и C++ dll, и это может быть решение, как описано [здесь] (http://stackoverflow.com/questions/420617/доступ к внутрисетевому-DLL-библиотека-компонента-из-Java) – GrahamA