The Java Native Keyword and Methods

Introduction to Java Native Keyword

Posted by Mr.Humorous 🥘 on January 21, 2019

1. The native Keyword in Java

Simply put, this native keyword is a non-access modifier that is used to access methods implemented in a language other than Java like C/C++.

It indicates platform-dependent implementation of a method or code and also acts as an interface between JNI and other programming languages.

2. native Methods

A native method is a Java method (either an instance method or a class method) whose implementation is also written in another programming language such as C/C++.

Moreover, a method marked as native cannot have a body and should end with a semicolon:

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

We can use them to:

  • implement an interface with system calls or libraries written in other programming languages
  • access system or hardware resources that are only reachable from the other language
  • integrate already existing legacy code written in C/C++ into a Java application
  • call a compiled dynamically loaded library with arbitrary code from Java

3. Examples

3.1 Accessing Native Code in Java

A class DateTimeUtils that needs to access a platform-dependent native method named getSystemTime:

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

To load it, we’ll use the System.loadLibrary.

Let’s place the call to load this library in a static block so that it is available in our class:

public class DateTimeUtils {
    public native String getSystemTime();

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

We have created a dynamic-link library, nativedatetimeutils, that implements getSystemTime in C++ using detailed instructions covered in our guide to JNI article.

3.2 Testing native Methods

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());
    }
}

Below is the output of the logger:

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

As we can see, with the help of the native keyword, we’re successfully able to access a platform-dependent implementation written in another language (in our case C++).