Я думаю, вы обнаружите, что использование JNI не так сложно, как кажется до погружения. Есть некоторые важные компромиссы и ограничения, но в целом JNI работает хорошо, и его достаточно легко использовать, как вы и предполагали.
Как уже говорили другие, лучший случай для JNI:
- Сложный нативный код (бонусные баллы, если этот код уже оказался очень надежным)
- Минимальный возврат туда-сюда между Java и собственным кодом (вы хотите минимизировать количество обращений через уровень JNI)
- Достаточно простой интерфейс вызова нативного кода (или также обратно в Java, если ваш нативный код должен использовать объекты / методы Java)
Определенно возможно автоматизировать или псевдоавтоматизировать создание слоя JNI для разумно структурированного набора собственных компонентов. Это будет стоить того, если количество компонентов для упаковки велико.
Хорошей новостью с JNI является то, что вам будет легко создать и протестировать этот интерфейс, например, вы должны быть в состоянии написать тестовые случаи из Java, которые используют поведение существующего алгоритма, и если есть проблемы, они, скорее всего, будут в самом слое JNI, а не в алгоритмах (учитывая вашу уверенность в нативной реализации).
Переписывание большого количества алгоритмов C / C ++ в Java кажется мне гораздо более рискованным, чем использование JNI. Без знания деталей, конечно, сложно измерить, но есть небольшие различия между технологиями, которые, как я мог себе представить, влияют на фактическую реализацию алгоритма, не говоря уже о чисто инженерных усилиях и риске ошибок.
И последнее соображение - будущая жизнь этих алгоритмов или связанных с ними компонентов. Набор алгоритмов более или менее полон, или вы продолжаете добавлять? В любом случае, существует ли серьезная причина для технического обслуживания и / или дальнейшего развития, чтобы отдать предпочтение одной технологии над другой? Например, если все остальное в Java и все новые алгоритмы будут в Java, и почти все в команде почти всегда программируют на Java, повторное выполнение на Java начинает выглядеть более привлекательным в долгосрочной перспективе.
Однако даже с учетом сказанного, рабочие козыри последовательны. Для большого количества хорошо функционирующих нативных компонентов я все же был бы склонен начать с JNI, даже если вы собираетесь переходить на Java в долгосрочной перспективе.