Использовать статические библиотеки Windows из кода Java с минимальными усилиями (предпочтительно с использованием JNA) - PullRequest
3 голосов
/ 10 мая 2009

Я должен использовать некоторую статическую библиотеку Windows (*.lib) из кода Java, я могу писать обертки JNI для C ++, но я бы предпочел этого не делать (не так, как в C ++).

Каким будет самый простой способ (с наименьшими затратами на разработку) его использовать, производительность не важна, поскольку этот код будет просто извлекать некоторые данные, над которыми, скорее всего, будет работать на стороне JAVA.

Скорее всего, я бы использовал JNA , но для AFAIK нужны динамические библиотеки, а у меня есть статические.

Я также задал вопрос n о преобразовании статических библиотек в динамические.

Ответы [ 2 ]

3 голосов
/ 10 мая 2009

Вы всегда можете создать проект DLL (динамическая библиотека), который вызывает напрямую в вашу статическую библиотеку, а затем вы можете использовать JNA с новой созданной DLL.

2 голосов
/ 11 мая 2009

Как бы то ни было, у меня был такой проект некоторое время назад. Было довольно легко автоматически генерировать оболочки JNI. Я думаю, у нас было около 350 экспортов функций для упаковки. Нам потребовалось около 3 часов, чтобы составить сценарий для автоматической генерации оболочки (извините, у вас нет удобного сценария, иначе я бы его опубликовал).

Мы сами почти не писали код на C ++ - но это действительно требовало понимания того, как работает JNI ... На самом деле это хорошая возможность / проект обучения - если у вас есть время, не бойтесь JNI - вы будете поражен тем, как много вы узнаете о том, как работает JVM ...

Если вы пойдете по этому пути, я рекомендую вам сохранять свои функции-обертки действительно очень легкими - буквально не обрабатывать их вообще. Просто преобразуйте необходимые аргументы из значений JNI в native (это в основном необходимо для строк), вызовите собственную функцию и преобразуйте результаты обратно.

Если у вас есть функция, которая передает указатель на строку и ожидает, что строка вернется в указатель, используйте массив строк размером 1 со стороны Java и заполните его результатом собственного вызова.

Или, если вам не хватает времени, скомпилируйте ваш .lib в .dll и используйте JNA: -)

...