JNI の概要

JVM の観点からは、「Java™」と「ネイティブ」の 2 つのタイプのコードがあります。 Java Native Interface (JNI) は、この 2 つの間に、明確に定義され、プラットフォームに依存しないインターフェースを確立します。

ネイティブ・コードは、Java と共に 2 つの異なる方法で使用できます。1 つは実行中の JVM で「ネイティブ・メソッド」として使用する方法で、もう 1 つは「呼び出し API」を使用して JVM を作成するコードとして使用する方法です。 このセクションでは、その違いを説明します。

ネイティブ・メソッド

Java ネイティブ・メソッドは、Java で宣言され、別の言語 (C や C++ など) で実装され、必要に応じて JVM によってロードされます。 ネイティブ・メソッドを使用するには、以下の手順を実行する必要があります。

  1. Java コードでネイティブ・メソッドを 宣言 します。

    javac コンパイラーは、Java ソース・コードでネイティブ・メソッド宣言を検出すると、メソッドの名前とパラメーターを記録します。 Java ソース・コードには実装が含まれていないため、コンパイラーはメソッドに「ネイティブ」のマークを付けます。 これで、JVM はメソッドが呼び出されたときに正しく解決することができます。

  2. ネイティブ・メソッドを実装します。

    ネイティブ・メソッドは、ロード可能なバイナリー・ライブラリー内の外部エントリー・ポイントとして実装されます。 ネイティブ・ライブラリーの内容は、プラットフォーム固有です。 JNI によって、JVM が任意のネイティブ・メソッドをプラットフォームに依存しない方法で使用する方法が提供されます。

    JVM は、ネイティブ・メソッドに対する呼び出しを実行します。 JVM がネイティブ・メソッド内にある場合、JNI は JVM に「コールバック」する手段を提供します。

  3. 使用する VM のネイティブ・メソッド・コードをロードします。

    ネイティブ・メソッドを宣言するだけでなく、メソッドを含むネイティブ・ライブラリーを実行時に検出してロードする必要があります。

    次の 2 つの Java インターフェースがネイティブ・ライブラリーをロードします。

    • java.lang.System.load()
    • java.lang.System.loadLibrary()

    通常は、ネイティブ・メソッドを宣言するクラスによって、クラスの静的イニシャライザー内にネイティブ・ライブラリーがロードされます。

呼び出し API

JVM の作成では、ネイティブ・コードを使用します。 この目的で使用する JNI の側面を、JNI 呼び出し API と呼びます。 呼び出し API を使用するには、実装環境固有の共有ライブラリーに静的または動的にバインドし、エクスポートする JNI_* 関数を呼び出します。

JNI の仕様と実装

JNI 仕様は、選択した実装環境の詳細について曖昧です。 簡潔で拡張可能な C および C++ のネイティブ・インターフェース向けの再使用可能なフレームワークを提供します。 JNI モデルは、JVMTI 仕様の基礎にもなっています。

Oracle Corporation の商標仕様および Java Compatibility Kit (JCK) は、実装ではなく仕様に準拠していることを確認します。 ネイティブ・コードはこの仕様に準拠する必要がありますが、実装に準拠する必要はありません。 規定されていない振る舞いに対して記述されたコードは、移植性や上位互換性に関する問題を引き起こす傾向があります。