質問

私は数年間 Java 開発者として働いており、JNI を使用すると非常に便利で強力なことができると聞いています。それを使用する必要がなかっただけなのか、それとも私にとってあまり関係がないのかはわかりません。しかし、私はまったくそれに触れる必要はありませんでした。

Java のこの側面がどのような役に立つのか疑問に思っています。例は素晴らしいでしょう。

役に立ちましたか?

解決

とても便利です。JNI を使用する主な理由は 2 つあります (おそらく他にもあります)。

  1. パフォーマンス。何らかの理由で Java ランタイムがパフォーマンスを低下させることができないコードがある場合。その関数をネイティブ コードで実装し、Java から呼び出すことができます。これにより、次の場合に実装を手動で調整できます。 本当に する必要があります。ただし、これは最も一般的な理由ではないと思われますが、Java は通常、問題なく実行されます。

  2. OS 固有の API へのアクセス。これは大したものだ。Java で何かを行う必要があるが、Java では提供できないものにアクセスする必要があるというケースがありました。私の場合、それはUNIXドメインソケットでした。(名前からわかるように) これらは UNIX 固有であるため、これらを使用する標準の Java 方法はありません。そこで、それらのラッパーのように機能するクラスを C で作成し、JNI でアクセスしました。ヴィオラ、問題は解決しました。

他のヒント

私は、iSeries が DB2、ユーザー キュー、データ キュー、およびその他のいくつかの OS/400 の仕様にアクセスするための広範な JNI 層を作成しました。iSeries 上のシステムの多くは、JNI がなければ不可能でした。つまり、はい、JNI にはその場所があり、必要なときに 本当に それが必要。

(純粋な Java に次ぐ) 比較的難しいですが、強力で恐ろしいものではありません。

また、JNI コードを調べているときは、次の使用も検討します。 JNA.

頭の中にいくつかの用途が思い浮かびます。

  1. 既存の低水準の技術との統合 (C/C )のAPIで、Javaを持たないもの カウンターパート
  2. アスペクトとの統合 システムのうち、公開されていないもの 利用可能なJava API(直接 ハードウェアアクセスなど)

コードの高度に最適化されたセクションを作成するのに便利だと言う人もいるかもしれませんが、最新の JVM ではかなり高速に動作しており、JNI を使用することによる複雑さの方がパフォーマンス上の利点を上回る可能性があります。

(ほとんどすべての) ビデオ/オーディオ形式の C デコードのために FFMPeg にバインドする用途はいくつかあります。

JNA もあるので、ライブラリ自体を使用しているかのように感じられます。これは、Java 開発者にすべてを渡して管理するという観点からは「簡単」ですが、構造マッピングを理解し、すべてのポインタなどを渡すために多くの単調な作業を行う必要があるという意味では難しくなります。正しく。

Suse Linux 上で実行されるレガシー C アプリケーションの周りに新しい UI をラップするという要件がありました。JNI はこの仕事に最適なツールでした。

一般に、JNI は、一度書けばどこでも実行できるという Java の概念に矛盾すると思います。ただし、JNI が役立つユースケースもあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top