Может ли Java-модуль вызвать модуль C? - PullRequest
3 голосов
/ 17 января 2010

Просто из интереса, можно ли вызвать модуль C из Java-модуля? Если да, то как это сделать?

Ответы [ 6 ]

5 голосов
/ 17 января 2010

да, вы можете использовать Собственный интерфейс Java , чтобы сделать это:

4 голосов
/ 18 января 2010

Да, вы можете сделать это. Должен ли делать это другое дело.

На стороне профессионала:

  • Вызов библиотек C из Java избавит от необходимости перекодировать библиотеки в Java (но см. Ниже).

  • Для некоторых вычислительных алгоритмов хорошо написанная реализация C может быть быстрее, чем эквивалентно хорошо написанная версия Java.

  • Некоторые специфические операции операционной системы не могут быть реализованы на чистом Java.

На стороне мошенника:

  • Существует большая нагрузка при выполнении вызова JNI по сравнению с простым вызовом метода Java.

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

  • Если ваша библиотека C имеет проблемы с управлением памятью, это может дестабилизировать платформу Java, что приведет к сбоям JVM.

  • Немедленный вызов собственных библиотек означает, что ваше приложение труднее портировать и требует более сложного процесса сборки.

3 голосов
/ 17 января 2010

Да, вы вызываете C / C ++ из Java с использованием собственного интерфейса Java ( JNI ) для этой цели.

Вы также можете использовать SWIG для этой цели:

1 голос
/ 17 января 2010

Да. Как уже упоминали другие, JNI или Java Native Interface - предпочтительный способ Sun сделать это. Если вы чувствуете, что вам нужно вызывать код C из других языков, а также из Java, я бы посмотрел на SWIG , который будет прозрачно генерировать код JNI для вас, но также позволит вам делать подобные вещи, например, с Python.

1 голос
/ 17 января 2010
0 голосов
/ 18 января 2010

Существует целый ряд компиляторов байт-кода C (Java) , которые могут превратить ваш код C в .jar переносимых классов Java, которые можно вызывать напрямую из Java.

Вред против JNI:

  • Заметное снижение производительности, обычно не менее 100%.

Преимущества по сравнению с JNI:

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

(Когда я говорю « JNI », я действительно имею в виду все интерфейсы Java для собственного кода. Например, то же самое относится к CNI .)

...