Как связать Java и C++ в экстремальных условиях?

Ситуация такова есть код на Java, который вызывает код из библиотеки(dll), написанной на С++, связка сейчас выглядит так:

Java - > wrapper.dll(Win32) -> target.dll(Win32)


wrapper.dll — обертка, оставшаяся от предыдущего программиста, есть неактуальный код, есть работающая версия только под win32

target.dll — библиотека поставляемая партнерами, нет кода, но есть версии библиотеки под все платформы.



Проблема в следующем: Как с этим зоопарком переехать на Linux? И возможно ли выпилить wrapper.dll
  • Вопрос задан
  • 5268 просмотров
Решения вопроса 1
kicum
@kicum Автор вопроса
Вот в такой ситуации у меня получилось следующее, по шагам:
1. Берем target.dll и декомпилируем ее, в результате получаем target.h — файл.
2. Берем target.so для Linux и так же декомпилируем ее, в результате получаем target-linux.h — файл.
3. Сравниваем их(мне повезло и они одинаковые более менее по сигнатурам функций и константам).
4. Скармливаем вот этой утилите — JNAerator, она нам выдает Java-код для вызова с помощью фреймворка JNA
5. Рефакторим сконструированный Java — код и работаем с ним(у меня получилось что функции в сгенерированном коде чуть отличаются по названиям)
6. Пишем декоратор для предыдущей реализации.

Ну вот и все!
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
barker
@barker
Очень сложно переехать с таким зоопарком на линукс в общем случае.
Насчёт выпилить wrapper.dll не очень понятно. Очевидно, это JNI-либа, которая дёргает уже какую-то левую target.dll. Вызывать напрямую в вашем случае практически нереально.
Я писал вместо wrapper.dll консольную утилитку, которая дёргает target.dll, а с ней общался через stdin/stdout. Более негеморное решение я придумать не смог.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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