JNI を使用することは、飛び込む前に思ったほど困難ではないことがわかると思います。いくつかの重要なトレードオフと制限がありますが、一般的に JNI はうまく機能し、意図したとおりに活用するのはかなり簡単です。
他の人が言っているように、JNIの最良のケースは次のとおりです。
- 複雑なネイティブ コード (そのコードが非常に信頼できることが既に証明されている場合はボーナス ポイント)
- Java とネイティブ コード間の最小限のやり取り (JNI レイヤー全体の移動を最小限に抑えたい場合)
- ネイティブ コードへのかなり単純な呼び出しインターフェイス (または、ネイティブ コードで Java オブジェクト/メソッドを利用する必要がある場合は、Java に戻る)
適切に構造化された一連のネイティブ コンポーネントの JNI レイヤーの作成を自動化または疑似自動化することは間違いなく可能です。ラップするコンポーネントの数が多い場合は、それだけの価値があります。
JNI の良いニュースは、このインターフェイスを簡単に構築してテストできることです。たとえば、既存のアルゴリズムの動作を利用する Java からテスト ケースを記述できる必要があります。アルゴリズムではなく、それ自体をレイヤー化します (ネイティブ実装に自信がある場合)。
Java で多数の C/C++ アルゴリズムを書き直すことは、JNI を使用するよりもはるかに危険に思えます。もちろん、詳細を知らなければ正確に判断するのは困難ですが、エンジニアリングの労力とエラーのリスクは言うまでもなく、アルゴリズムの実際の実装に影響を与えると想像できるテクノロジー間には微妙な違いがあります。
最後の考慮事項は、これらのアルゴリズムまたは関連コンポーネントの将来の寿命です。アルゴリズムのセットはほぼ完成していますか、それとも追加を続けていますか? いずれにせよ、ある技術を他の技術よりも優先する強力なメンテナンスおよび/または将来の開発理由はありますか? たとえば、他のすべてが Java であり、すべての新しいアルゴリズムが Java であり、チームのほぼ全員がほぼ常に Java でコーディングしている場合、Java での再実装は長期的にはより魅力的に見え始めます。
ただし、そうは言っても、作業は一貫性に勝ります。適切に機能する多数のネイティブ コンポーネントについては、長期的に Java に移行する予定がある場合でも、JNI から始める傾向があります。