Какой самый простой способ использовать исходный код C в приложении Java? - PullRequest
9 голосов
/ 17 сентября 2008

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

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


EDIT

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

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

Ответы [ 7 ]

11 голосов
/ 17 сентября 2008

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

5 голосов
/ 17 сентября 2008

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

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

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

4 голосов
/ 17 сентября 2008

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

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

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

1 голос
/ 17 сентября 2008

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

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

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

0 голосов
/ 17 сентября 2008

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

* AMPC 1004 *

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

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

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

0 голосов
/ 17 сентября 2008

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

0 голосов
/ 17 сентября 2008

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

System.loadLibrary("mylibrary.dll");

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...