Переписать код C в Java или использовать JNI?

этот ответ является языком: jupyter-notebook

18
задан Community 23 May 2017 в 11:48
поделиться

11 ответов

Простой ответ, если код будет названным много, И вопросы производительности тогда преобразовывают его в Java.

более сложные ответы:

  • , если библиотека, легко обернутая в JNI тогда, идет с JNI
  • , если тесты Вы имеете для кода C/C++, легко преобразованного в Java тогда, идут для порта

, я сделал бы следующее:

  • берут один из алгоритмов и переносятся, он в JNI
  • берет тот же алгоритм и преобразовывает, он к Java
  • видит, который является большим количеством боли, чтобы сделать
  • , если вопросы скорости тогда представляют обе версии и видят, кто из них приемлем.
18
ответ дан 30 November 2019 в 05:43
поделиться

Я думаю, что ответ заключается в объеме связи было бы между кодом Java вызова и вызванным кодом C/C++, и на уровне усилия перезапись повлечет за собой. Если Ваш код C берет несколько целых чисел, делает некоторое волосатое вычисление и возвращает другое международное Использование JNI. Если существует много комплекса назад и вперед, но алгоритмы довольно просты, переписывают их. Строка отказа является соединением JNI. Если это будет сложным, можно закончить тем, что писали больше кода интерфейса JNI, чем Вы были бы код алгоритма для перезаписи.

14
ответ дан 30 November 2019 в 05:43
поделиться

Если Вы планируете записать будущие проекты в Java, в противоположность C/C++. Я стиснул бы зубы теперь и портировал бы код на Java. Чем дольше Вы ожидаете, тем хуже это станет. JNI звучит привлекательным в этом случае, но тогда у Вас будет проблема кого-то имеющего необходимость поддержать код C++, когда все остальные будут на забавных новых проектах Java.

, Если это - один проект Java времени, то, почему Вы пишете это в Java?

8
ответ дан 30 November 2019 в 05:43
поделиться

Я все еще серьезно рассмотрел бы движение для JNI, особенно если Вы в состоянии минимизировать количество межъязыковых интерфейсов.

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

8
ответ дан 30 November 2019 в 05:43
поделиться

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

Как другой сказали, что лучший случай для JNI:

  • Сложный собственный код (бонусные очки, если тот код уже оказался очень надежным)
  • Минимальный назад и вперед между Java и собственным кодом (Вы хотите минимизировать прохождения через уровень JNI)
  • Довольно простой интерфейс вызова к собственному коду (или также назад к Java, если Вы - собственный код, должен усилить объекты/методы Java)

определенно возможно автоматизировать или псевдоавтоматизировать создание уровня JNI для обоснованно структурированного набора собственных компонентов. Это определенно стоило бы того, если количество компонентов для обертывания является большим.

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

Перезапись большого количества алгоритмов C/C++ в Java кажется очень более рискованной мне, чем использование JNI. Не зная детали трудно измерить, конечно, но существуют тонкие различия между технологиями, что я мог предположить влиять на фактическую реализацию алгоритма, не говоря уже о просто чистом техническом усилии и риске ошибки.

соображение финала А является будущим сроком действия этих алгоритмов или связанных компонентов. Действительно ли набор алгоритмов более или менее полон, или Вы продолжаете добавлять? Так или иначе есть ли сильное обслуживание и/или будущая причина разработки способствовать одной технологии по другому? Например, если все остальное находится в Java, и все новые алгоритмы будут в Java, и почти все в команде почти всегда кодируют в Java, повторно реализование в Java начинает выглядеть более привлекательным долгосрочный.

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

9
ответ дан 30 November 2019 в 05:43
поделиться

Если "алгоритмы" хорошо упаковываются, возможно, возможно создать некоторый автоматический код связующего звена через JNI? Это сократило бы риск ошибок (создающий сотни отдельных компонентов, вручную звучит опасным), и сделайте стоимость независимой от количества алгоритмов для добавления, более или менее.

Перезапись сотни компонентов звучат очень опасными, я определенно рекомендовал бы, по крайней мере, исследовать JNI более тесно сначала.

, Что требования ввода-вывода алгоритмы имеют относительно остальной части проекта? Если бы они справедливо слабо связываются, возможно, было бы возможно выполнить их как автономные отдельные программы, вызванные как подпроцессы от Java и использования, например, stdio для обмена данными?

13
ответ дан 30 November 2019 в 05:43
поделиться

Мост между C и Java является дорогим, поэтому если необходимо передать много данных назад и вперед нет никакой победы в вызове C по JNI.

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

можно хотеть рассмотреть компиляцию кода C как двоичный файл MIPS Linux, который может быть интерпретирован в Java. Довольно быстро, немного трудно для установки правильно. См. http://nestedvm.ibex.org/

, Также можно использовать llvm бэкенд для gcc для компиляции в байт-коды низкого уровня, которые могут тогда быть интерпретированы в Java. Это - также подход, проявленный с iPhone SDK afaik на Mac OS X. http://llvm.org/

3
ответ дан 30 November 2019 в 05:43
поделиться

receint Read Joel отправляют на" Выплата Ваш технический долг " тогда разрешение и преобразовывают его теперь, а не выплачивают процент за следующие годы пары и затем заплатить его.

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

2
ответ дан 30 November 2019 в 05:43
поделиться

Я был в такой ситуации. Я предлагаю вам привыкнуть к использованию многопоточных структур данных, доступных в Java. На этом этапе вы больше не захотите возвращаться к своим структурам данных C ++.

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

Когда вы сидите в коде C / C ++, вы думая, что ты хочешь держаться за это. Вы думаете обо всей любви, которую вкладываете в это. Через несколько лет вы поймете, что, удерживая его и используя JNI, вы создали монстра. Каждый раз, когда вы получаете сбой процесса, вы будете сожалеть об использовании JNI. После исправления сбоя процесса кто-то захочет изменить алгоритм в C ++, и вы Я захочу их задушить. У них будет удобное оправдание: «Я еще не привык к Java».

Взгляните на неизменные структуры данных в Java. Даже не думайте о скорости выполнения этих старых алгоритмов C / C ++. Я обнаружил, что мой новый код намного превосходит любой мой старый код C / C ++.

Пишем модульные тесты. Используйте NetBeans.

С уважением,

-Stosh

2
ответ дан 30 November 2019 в 05:43
поделиться

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

1
ответ дан 30 November 2019 в 05:43
поделиться

Если бы это только для Windows, и они уже находятся в DLL, возможно , JNA был бы полезен. (если хит производительности для вызовов функции через JNA не слишком плох)

0
ответ дан 30 November 2019 в 05:43
поделиться
Другие вопросы по тегам:

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