«1. Обзор
В этом кратком руководстве мы обсудим концепцию ключевого слова native в 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.