1. Обзор
В этом кратком руководстве мы обсудим концепцию ключевого слова native в Java, а также покажем, как интегрировать методы native в код Java.
2. Ключевое слово native в Java
Прежде всего, давайте обсудим, что такое ключевое слово native в Java.
Проще говоря, это модификатор без доступа, который используется для доступа к методам, реализованным на языке, отличном от Java, например C/C++ .
Он указывает на зависящую от платформы реализацию метода или кода, а также действует как интерфейс между JNI и другими языками программирования.
3. собственные методы
A родной метод-это метод Java (либо метод экземпляра, либо метод класса), реализация которого также написана на другом языке программирования, таком как C/C++.
Кроме того, метод, помеченный как native , не может иметь тела и должен заканчиваться точкой с запятой:
[ 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.
Давайте поместим вызов для загрузки этой библиотеки в блок static , чтобы она была доступна в нашем классе:
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. Заключение
В этой статье мы изучили основы native ключевых слов и методов. На коротком примере мы также узнали, как интегрировать их в Java.
Фрагменты кода, используемые в этой статье, доступны через Github .