1. 概要

このクイックチュートリアルでは、Javaの native キーワードの概念について説明し、nativeメソッドをJavaコードに統合する方法も示します。

2. Javaのnativeキーワード

まず、Javaのnativeキーワードとは何かについて説明しましょう。

簡単に言えば、これは、C / C++などのJava以外の言語で実装されたメソッドにアクセスするために使用される非アクセス修飾子です。

これは、メソッドまたはコードのプラットフォーム依存の実装を示し、JNIと他のプログラミング言語の間のインターフェースとしても機能します。

3. ネイティブメソッド

native メソッドはJavaメソッド(インスタンスメソッドまたはクラスメソッドのいずれか)であり、その実装もC /C++などの別のプログラミング言語で記述されています。

さらに、 native とマークされたメソッドは本体を持つことができず、セミコロンで終了する必要があります。

[ public | protected | private] native [return_type] method ();

それらを使用して次のことができます。

  • 他のプログラミング言語で記述されたシステムコールまたはライブラリとのインターフェースを実装する
  • 他の言語からのみ到達可能なシステムまたはハードウェアリソースにアクセスする
  • C /C++で記述された既存のレガシーコードをJavaアプリケーションに統合します
  • Javaから任意のコードを使用して、コンパイルされた動的にロードされたライブラリを呼び出す

4. 例

これらのメソッドをJavaコードに統合する方法を示しましょう。

4.1. Javaでのネイティブコードへのアクセス

まず、getSystemTimeという名前のプラットフォーム依存のnativeメソッドにアクセスする必要があるクラスDateTimeUtilsを作成しましょう。

public class DateTimeUtils {
    public native String getSystemTime();
    // ...
}

ロードするには、System.loadLibrary。を使用します

このライブラリをロードする呼び出しを静的ブロックに入れて、クラスで使用できるようにします。

public class DateTimeUtils {
    public native String getSystemTime();

    static {
        System.loadLibrary("nativedatetimeutils");
    }
}

JNIの記事のガイドに記載されている詳細な手順を使用して、C++でgetSystemTimeを実装するダイナミックリンクライブラリnativedatetimeutilsを作成しました。

4.2. ネイティブメソッドのテスト

最後に、DateTimeUtilsクラスで定義されたネイティブメソッドをテストする方法を見てみましょう。

public class DateTimeUtilsManualTest {

   @BeforeClass
    public static void setUpClass() {
        // .. load other dependent libraries  
        System.loadLibrary("nativedatetimeutils");
    }

    @Test
    public void givenNativeLibsLoaded_thenNativeMethodIsAccessible() {
        DateTimeUtils dateTimeUtils = new DateTimeUtils();
        LOG.info("System time is : " + dateTimeUtils.getSystemTime());
        assertNotNull(dateTimeUtils.getSystemTime());
    }
}

以下はロガーの出力です。

[main] INFO  c.b.n.DateTimeUtilsManualTest - System time is : Wed Dec 19 11:34:02 2018

ご覧のとおり、 native キーワードを使用すると、別の言語(この場合はC ++)で記述されたプラットフォーム依存の実装に正常にアクセスできます。

5. 結論

この記事では、nativeのキーワードとメソッドの基本を学びました。 簡単な例で、それらをJavaに統合する方法も学びました。

この記事で使用されているコードスニペットは、Githubから入手できます。