Javaネイティブのキーワードとメソッド

1. 概要

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

2. Javaの_native_キーワード

まず、Javaの_native_キーワードとは何かを説明します。
*簡単に言えば、これは非アクセス修飾子であり、C / C ++ *などのJava以外の言語で実装されたメソッドにアクセスするために使用されます。
これは、プラットフォームに依存するメソッドまたはコードの実装を示し、https://www.baeldung.com/jni [JNI]と他のプログラミング言語との間のインターフェースとしても機能します。

3. _native_メソッド

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

    さらに、_native_としてマークされたメソッドはボディを持つことができず、セミコロンで終わる必要があります。
[ public | protected | private] native [return_type] method ();
それらを次の目的で使用できます。
  • 他の言語で記述されたシステムコールまたはライブラリとのインターフェースを実装する
    プログラミング言語

  • からのみ到達可能なシステムまたはハードウェアリソースにアクセスする
    他の言語

  • C / C ++で記述された既存のレガシーコードをJavaに統合する
    応用

  • コンパイルされた動的にロードされたライブラリを任意のコードで呼び出します
    Java

4. 例

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

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

まず、platform_getSystemTime_という名前のプラットフォーム依存の_native_メソッドにアクセスする必要がある_DateTimeUtils_クラスを作成しましょう。
public class DateTimeUtils {
    public native String getSystemTime();
    // ...
}
ロードするには、_System.loadLibrary._を使用します
このライブラリをロードする呼び出しをa __static __blockに入れて、クラスで使用できるようにします。
public class DateTimeUtils {
    public native String getSystemTime();

    static {
        System.loadLibrary("nativedatetimeutils");
    }
}
link:/jni[JNI記事のガイド]で説明されている詳細な手順を使用して、C ++で_getSystemTime_を実装するダイナミックリンクライブラリlink_nativedatetimeutils_を作成しました。

4.2. _native_メソッドのテスト

最後に、_DateTimeUtils_ classで定義されたネイティブメソッドをテストする方法を見てみましょう。
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に統合する方法も学びました。
この記事で使用されているコードスニペットはhttps://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-lang[Githubで利用可能]です。