Перейти к основному содержимому

Родное ключевое слово и методы Java

· 3 мин. чтения

1. Обзор

В этом кратком руководстве мы обсудим концепцию нативного ключевого слова в Java, а также покажем, как интегрировать нативные методы в код Java.

2. Родное ключевое слово в Java

Прежде всего, давайте обсудим, что такое нативное ключевое слово в Java.

Проще говоря, это модификатор без доступа, который используется для доступа к методам, реализованным на языке, отличном от Java, таком как C/C++ .

Он указывает зависящую от платформы реализацию метода или кода, а также действует как интерфейс между JNI и другими языками программирования.

3. Родные методы

Собственный метод — это метод Java (либо метод экземпляра, либо метод класса), реализация которого также написана на другом языке программирования, таком как C/C++.

Более того, метод, помеченный как нативный , не может иметь тела и должен заканчиваться точкой с запятой:

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

Мы можем использовать их для:

  • реализовать интерфейс с системными вызовами или библиотеками, написанными на других языках программирования
  • получить доступ к системным или аппаратным ресурсам, которые доступны только из другого языка
  • интегрировать уже существующий устаревший код, написанный на C/C++, в приложение Java
  • вызвать скомпилированную динамически загружаемую библиотеку с произвольным кодом из Java

4. Примеры

Давайте теперь продемонстрируем, как интегрировать эти методы в наш код Java.

4.1. Доступ к собственному коду в Java

Прежде всего, давайте создадим класс DateTimeUtils , которому необходимо получить доступ к платформенно-зависимому собственному методу с именем getSystemTime :

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

Чтобы загрузить его, мы будем использовать System.loadLibrary.

Давайте поместим вызов для загрузки этой библиотеки в статический блок, чтобы она была доступна в нашем классе:

public class DateTimeUtils {
public native String getSystemTime();

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

Мы создали библиотеку динамической компоновки, nativedatetimeutils , которая реализует getSystemTime на C++, используя подробные инструкции, приведенные в нашем руководстве по JNI .

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. Вывод

В этой статье мы изучили основы нативных ключевых слов и методов. На быстром примере мы также узнали, как интегрировать их в Java.

Фрагменты кода, использованные в этой статье, доступны на Github .