Что значит native java

Native-методы

// Файл NativeDemo.java // Простой пример, который использует native-метод. public class NativeDemo < int i; public static void main(String args[]) < NativeDemo ob = new NativeDemo(); ob.i = 10; System.out.println(«Этотob.iпередnative-методом:» + ob.i); ob.test(); // Вызовnative-метода System.out.println(«Этот ob.i после native-метода:» + ob.i); > // Объявить native-метод public native void test(); // Загрузить DLL, который содержит static-метод static < System.loadLibrary("NativeDemo"); >> Заметим, что метод test()объявлен какnativeи не имеет тела. Он будет реализован наС. Обратите также внимание на блокstatic. Как объяснялось ранее,static-блок выполняется только один раз, когда программа начинает выполняться (или, более точно, когда его класс впервые загружается). В данном случае он используется для загрузкиDLL-библиотеки (Dynamic Link Library — библиотека программ с динамической загрузкой.), которая содержитnative-реализацию методаtest(). (Далее вы увидите, как можно создать такую библиотеку.) Библиотека загружается методом loadLibrary(), который является частью классаsystem. Вот его общая форма: static void loadLibrary (String filename) Здесь filename — строка, которая специфицирует имя файла, содержащего библиотеку. Для средыWindows95/98/NTпредполагается, что этот файл имеет расширение.dll. После ввода программы, откомпилируйте ее, чтобы получить файл NativeDemo.class. Затем, вы должны использоватьJDK-утилитуjavah.exeдля получения файла C/C++ заголовкаNativeDemo.h. ФайлNativeDemo.hнужно включить в реализацию методаtest(). Для построенияNativeDemo.hиспользуйте следующую команду: javah -jni NativeDemo Данная команда производит файл заголовка с именем NativeDemo.h. Этот файл должен быть включен в С-файл, который реализуетtest(). Вывод указанной команды: /* НЕ РЕДАКТИРУЙ ЭТОТ ФАЙЛ — он сгенерирован машиной */ #include /* Заголовок класса NativeDemo */ #ifndef _Included_NativeDemo #define _Included_NativeDemo #ifdef __cplusplus extern «C» < #endif /* * Class: NativeDemo * Method: test * Signature: ()V */ JNIEXPORT void JNI CALL Java_NativeDemo_test (JNIEnv *, jobject); #ifdef__cplusplus >#endif #endif Обратите особое внимание на следующую строку, определяющую прототип функции test(), которую вы будете создавать: JNIEXPORT void JNI CALL Java_NativeDemo_test (JNIEnv *, jobject); Заметим, что имя функции — Java_NativeDemo_test() — его нужно использовать как имя native-функции, которую вы реализуете. То есть вместо создания С-функции, названнойtest(), вы будете создавать функцию с именемJava_NativeDemo_test(). КомпонентNativeDemo префикса добавляется потому, что он идентифицирует методtest()как часть классаNativeDemo. Помните, что другой класс может определить свой собственный native-методtest(), который полностью отличается от того, что объявлен вNativeDemo. Включение в префикс имени класса обеспечивает возможность дифференцировать различные версии. Общее правило: native-функциям нужно давать имя, чей префикс включает имя класса, в котором они объявлены. После создания необходимого файла заголовка вы можете написать свою реализациюtest()исохранить его в файле с именем NativeDemo.с: /* Этот файлсодержит С-версию метода test(). */ #include «NativeDemo.h» #include JNIEXPORT void JNICALL Java_NativeDemo_test (JNIEnv *env, jobject obj) < jclass cls; jfieldID fid; jint i; printf("Запускnative-метода.\n"); cls = (*env).GetObjectClass(obj); fid = (*env).GetFieldID(cls, "i", "I"); if(fid == 0) < printf ("Heвозможно получить id поля.\n"); return; >i = (*env).GetIntField(obj, fid); printf(«i = %d\n», i); (*env)->SetIntField(env, obj, fid, 2*i); printf(«Завершение native-метода.\n»); > Заметим, что файл включает jni.h, который содержит интерфейсную информацию. Этот файл обеспечиваетсяJava-компилятором. Файл заголовкаNativeDemo.hбыл создан ранее с помощью утилитыjavah. В этой функции метод Getobjectciass()используется для получения С-структуры, которая содержит информацию о классеNativeDemo. МетодGetFieldlD()возвращает С-структуру с информацией о поле класса с именем”i”. МетодGetIntFieid()извлекает первоначальное значение этого поля. МетодSetIntField()хранит обновленное значение в данном поле. (Дополнительные методы, которые обрабатывают другие типы данных, см. в файлеjni.h.) После создания NativeDemo.cнужно откомпилировать его и создатьDLL-файл. Для этого используетсяMicrosoft-компилятор C/C++ со следующей командной строкой: Cl /LD NativeDemo.c Это создает файл с именем NativeDemo.dll. Как только указанная процедура проделана, можно выполнятьJava-программу, которая сгенерирует следующий вывод: Этот ob.i перед native-методом: 10 Запуск native-метода, i = 10 Завершение native-метода. Этот ob.i после native-метода: 20 Специфика использования nativeзависит от реализации и среды. Кроме того, специфика способа взаимодействия с кодомJavaподвергается изменениям. По деталям работы сnative-методами нужно обращаться к документации системы разработкиJava-программ.

Читайте также:  Javascript select all rows in table

Для продолжения скачивания необходимо пройти капчу:

Источник

Использование ключевого слова native в Java

Часто при изучении Java возникает вопрос о назначении и использовании ключевого слова native . Это ключевое слово используется, когда необходимо вызвать метод, который не написан на Java, а написан на другом языке программирования, таком как C или C++.

Примером может служить ситуация, когда разработчику требуется использовать некоторые низкоуровневые возможности операционной системы или вызвать функцию, которая была написана на другом языке программирования. В этом случае, в Java-коде объявляют метод с ключевым словом native , и этот метод будет связан с некоторой функцией, написанной на другом языке программирования, через Java Native Interface (JNI).

public class NativeExample

В приведенном выше примере exampleMethod — это нативный метод, который должен быть реализован на другом языке программирования.

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

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

Источник

Ключевое слово и методы Java Native

Изучите основы собственных ключевых слов и методов Java.

1. Обзор

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

2. Ключевое слово native в Java

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

Читайте также:  Rmngrcalls cpp что это 1с

Проще говоря, это модификатор без доступа, который используется для доступа к методам, реализованным на языке, отличном от 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++).

Читайте также:  Parse html from php

5. Заключение

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

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

Читайте ещё по теме:

Источник

Оцените статью