Какой самый простой способ использовать исходный код C в приложении Java?

StackOverflow https://stackoverflow.com/questions/83299

  •  01-07-2019
  •  | 
  •  

Вопрос

Я нашел библиотеку с открытым исходным кодом, которую хочу использовать в своем Java-приложении.Библиотека написана на C и разработана под Unix/Linux, а мое приложение будет работать в Windows.Это библиотека, состоящая в основном из математических функций, поэтому, насколько я могу судить, она не использует ничего платформо-зависимого, это просто очень простой код на C.Кроме того, он не такой уж и большой, менее 5000 строк.

Какой самый простой способ использовать библиотеку в моем приложении?Я знаю, что существует JNI, но это включает в себя поиск компилятора для компиляции библиотеки под Windows, обновление среды JNI, написание кода и т. д.Реально, но не так просто.Есть ли более простой способ?Учитывая небольшой размер библиотеки, у меня возникает соблазн просто перевести ее на Java.Есть ли какие-нибудь инструменты, которые могут в этом помочь?


РЕДАКТИРОВАТЬ

В итоге я перевел на Java ту часть библиотеки, которая мне была нужна.На данный момент это около 10% библиотеки, хотя со временем она, вероятно, увеличится.C и Java очень похожи, поэтому это заняло всего несколько часов.Основная сложность — исправление ошибок, возникших из-за ошибок в переводе.

Спасибо всем за вашу помощь.Все предложенные решения показались мне интересными, и я рассмотрю их, когда мне понадобится связать их с более крупными библиотеками.Для небольшого фрагмента кода на языке C самым простым решением был перевод вручную.

Это было полезно?

Решение

Лучше всего, вероятно, взять хорошую книгу (K&R:Язык программирования C) чашка чая и приступаем к переводу!Я бы скептически отнесся к доверию программе-переводчику, ведь чаще всего не лучший переводчик – это вы сами!Если вы сделаете это, значит, все готово, и вам не нужно повторять это снова.Если библиотека имеет открытый исходный код, могут возникнуть некоторые сложности, поэтому вам необходимо внимательно проверить лицензию.Еще один момент, который следует учитывать, заключается в том, что в переводе всегда будет некоторый элемент риска и потенциальная ошибка, поэтому, возможно, потребуется рассмотреть возможность написания некоторых тестов, чтобы убедиться в правильности перевода.

Нет ли математических функций, эквивалентных JAVA?

Как вы сами комментируете, путь JNI возможен, а для компилятора c вы, вероятно, могли бы использовать «Bloodshead Dev-c++», но это требует больших усилий для ~ 5000 строк.

Другие советы

На Научная библиотека Java GNU проект, который я использовал глоток для создания классов-оболочек JNI вокруг библиотек C.Отличный инструмент, который также может генерировать код-оболочку на нескольких языках, включая Python.Настоятельно рекомендуется.

Я бы скомпилировал его и использовал JNA.

JNA (Java Native Access) по сути делает во время выполнения то же, что JNI во время компиляции, и не требует никакого кода, отличного от Java (тоже не так много Java).

Я не знаю о его производительности или удобстве использования в вашем случае, но я бы попробовал.

Вы уверены, что хотите использовать библиотеку C, даже если она такая маленькая?

Как только 64-битная версия станет немного более распространенной, вам нужно будет начать создавать/развертывать как 32-битную, так и 64-битную версии библиотеки.И в зависимости от того, что представляет собой код C, вам может потребоваться или не потребоваться обновить код, чтобы он был построен как 64-битный.

Если библиотека C проста, возможно, будет проще просто перенести библиотеку C на чистую Java и не заниматься сборкой/развертыванием библиотеки JNI, библиотеки C и кода Java.

Ну, есть AMPC.Это компилятор C для Windows, MacOS X и Linux, который может компилировать код C в байт-код Java (вид кода, который запускается на виртуальной машине Java).

АМПК

Однако он является коммерческим и стоит 199 долларов за лицензию.Сомневаюсь, что это окупится для вас ;) Я не знаю ни одного такого бесплатного компилятора.

OTOH, Java и C очень похожи.Вероятно, вы могли бы выполнить рефакторинг кода C на Java (структуры можно заменить объектами с общедоступными переменными экземпляра), а операции с указателями обычно можно преобразовать во что-то другое (например, операции с массивами).Хотя я думаю, вам не хочется читать 5000 строк кода, не так ли?

Использование JNI делает код зависимым от платформы, однако, если вы говорите, что C не зависит от платформы, нет причин, по которым ваш код Java должен зависеть от платформы.OTOH, в зависимости от того, насколько дорогостоящими являются эти вычисления, использование JNI может фактически дать вам прирост производительности, поскольку, когда дело доходит до пропускной способности обработки необработанных чисел, C все равно может превзойти Java по скорости.Однако вызовы JNI очень затратны, поэтому, если вычисление представляет собой простое и быстрое вычисление, сам вызов JNI может занять столько же времени (или даже больше), чем выполненное вычисление, и в этом случае использование JNI не принесет вам ничего, кроме замедления выключение вашего приложения и увеличение нагрузки на память.

Действительно, JNA выглядит впечатляюще, требует меньше усилий, чем непосредственное использование JNI.Но в любом случае вы потеряете независимость от платформы, а поскольку вы, вероятно, используете лишь небольшую ее часть, вы можете рассмотреть возможность перевода того, что вам действительно нужно.

Пробовали ли вы использовать:

System.loadLibrary("mylibrary.dll");

Не уверен, что это будет работать с чистой библиотекой C, но, вероятно, стоит попробовать.:)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top