Что такое нативный метод
Что такое нативные методы в Java и где их следует использовать?
Нативный метод имеет тот же синтаксис, что и абстрактный метод, но где он реализован?
Что такое нативные методы в Java и где их следует использовать?
Как только вы видите небольшой пример, становится ясно:
Main.Java :
main.C :
Скомпилируйте и запустите :
Выход :
Протестировано на Ubuntu 14.04 с Oracle JDK 1.8.0_45.
Итак, ясно, что это позволяет:
Это может быть использовано для:
с компромиссом более низкой мобильности.
Вы также можете вызвать Java из C, но сначала вы должны создать JVM в C: Как вызывать Java функции из C++?
Пример на GitHub для вас, чтобы играть с.
Метод реализован в «родном» коде. То есть код, который не запускается в JVM. Обычно он написан на C или C++.
Нативные методы обычно используются для взаимодействия с системными вызовами или библиотеками, написанными на других языках программирования.
Мне нравится знать, где мы используем родные методы
В идеале совсем нет. В действительности некоторые функции недоступны в Java, и вам нужно вызвать некоторый C-код.
Методы реализованы в C-коде.
Необходимость нативного кода Java:
надеюсь, что эти пункты отвечают на ваш вопрос 🙂
Собственные методы позволяют вам использовать код из других языков, таких как C или C++, в вашем коде Java. Вы используете их, когда Java не обеспечивает необходимую вам функциональность. Например, если бы я писал программу для вычисления какого-либо уравнения и создания его линейного графика, я бы использовал Java, потому что это язык, на котором я лучше всего. Однако я также хорошо владею C. Скажем, в части моего Программа мне нужна для вычисления действительно сложного уравнения. Я бы использовал для этого нативный метод, потому что я знаю немного C++ и знаю, что C++ намного быстрее, чем Java, поэтому, если бы я написал свой метод на C++, он был бы быстрее. Также, скажем, я хочу взаимодействовать с другой программой или устройством. Это также будет использовать нативный метод, потому что в C++ есть что-то, называемое указателями, что позволило бы мне сделать это.
Русские Блоги
Изучая рабочий механизм JVM, я обнаружил, что область локального метода используется для выполнения собственного метода; так что в этом вопросе, что такое собственный метод?
Что такое Нативный метод
Объявление этих методов описывает, как выглядит не-java-код в этом java-коде.
Нативный идентификатор может использоваться со всеми другими идентификаторами Java.
За исключением abstract;, поскольку native подразумевает, что эти методы имеют тела реализации, но эти тела реализации не являются java, но abstract ясно указывает, что эти методы не имеют тел реализации.
Когда нативный метод используется вместе с другими идентификаторами Java, его смысл такой же, как и в случае нативного метода.
Собственная статика указывает, что этот метод можно вызывать напрямую, без создания экземпляра класса, что очень удобно;
Третий метод выше использует собственную синхронизацию, и JVM выполнит механизм блокировки синхронизации перед входом в реализацию этого метода (точно так же, как многопоточность Java).
Собственный метод может возвращать любой тип Java, а также может реализовывать управление исключениями;
Реализация этих методов вызывает исключение и выбрасывает его, что аналогично методу Java;
Когда собственный метод принимает некоторые неосновные типы, метод может получить доступ к внутренним компонентам этих неосновных типов, но это сделает собственный метод зависимым от реализации класса Java, к которому осуществляется доступ; это не так удобно, как использование функций на языке Java
Существование собственного метода не влияет на другие классы, вызывающие эти собственные методы. Фактически, другие классы, вызывающие эти методы, даже не знают, что он вызывает собственный метод.
JVM будет контролировать все детали вызова локальных методов
Класс, содержащий локальный метод, наследуется, подкласс унаследует локальный метод и может переписать этот метод на языке java (это кажется немного странным), то же самое, если локальный метод идентифицирован fianl, он не может быть унаследован Переписать
Собственные методы расширяют JVM;
Зачем использовать нативный метод
В Java непросто реализовать некоторые уровни задач в Java;
неэффективен для некоторых программ;
Взаимодействие между Java и средой за пределами Java
Это основная причина существования собственных методов: например, Java обменивается информацией с некоторыми базовыми системами, такими как операционные системы или некоторое оборудование;
Собственный метод предоставляет очень лаконичный интерфейс без необходимости знать детали вне приложения Java;
Взаимодействовать с операционной системой
JVM поддерживает сам язык Java и библиотеки времени выполнения; JVM также полагается на некоторую базовую поддержку; посредством использования собственных методов Java реализует взаимодействие между jre и системой формирования; при использовании некоторого языка Java сам по себе не обеспечивает характеристик инкапсулированного операционная система, нам также необходимо использовать локальные методы;
Sun‘Java
Интерпретатор Sun реализован на C; большая часть jre реализована на Java, который взаимодействует с внешним миром через некоторые локальные методы; например: метод setPriority () java.lang.Thread реализован на Java, но его реализация вызывает это class Локальный метод setPriority0 (); этот локальный метод реализован на C и имплантирован внутри JVM;
На платформе Windows 95 этот собственный метод в конечном итоге вызовет API Win32 SetPriority (). Это конкретная реализация локального метода, напрямую предоставляемого JVM. В большинстве случаев локальный метод предоставляется внешней библиотекой динамической компоновки, а затем вызывается JVM.
Как JVM запускает собственные методы
Когда класс используется впервые, байт-код этого класса будет загружен в память и будет перезагружен только один раз. Запись загруженного байт-кода содержит список всех дескрипторов методов этого класса. Эти дескрипторы методов содержат такую информацию: где хранится код метода, какие параметры он имеет, дескриптор метода (открытый класс) и т. Д.
Что такое нативные методы в Java и где их следует использовать? [Дубликат]
На этот вопрос уже есть ответ здесь:
Нативный метод имеет тот же синтаксис, что и абстрактный метод, но где он реализован?
5 ответов
Что такое нативные методы в Java и где их следует использовать?
Как только вы видите небольшой пример, становится ясно:
Main.java
main.c
Скомпилируйте и запустите :
Выход
Протестировано в Ubuntu 14.04 с Oracle JDK 1.8.0_45.
Итак, ясно, что это позволяет:
Это может быть использовано для:
с компромиссом более низкой мобильности.
Вы также можете вызывать Java из C, но вы должны сначала создать JVM в C: Как вызывать функции Java из C ++?
Метод реализован в «родном» коде. То есть код, который не запускается в JVM. Обычно он написан на C или C ++.
Собственные методы обычно используются для взаимодействия с системными вызовами или библиотеками, написанными на других языках программирования.
Мне нравится знать, где мы используем родные методы
В идеале, совсем нет. На самом деле некоторые функции недоступны в Java, и вам нужно вызывать код на C.
Методы реализованы в коде C.
Необходимость собственного кода Java:
надеюсь, что эти пункты ответят на ваш вопрос:)
Нативные методы позволяют вам использовать код из других языков, таких как C или C ++, в вашем Java-коде. Вы используете их, когда Java не предоставляет необходимую вам функциональность. Например, если бы я писал программу для вычисления какого-либо уравнения и построения его линейного графика, я бы использовал java, потому что это язык, на котором я лучше всего. Однако я также хорошо владею C. Скажу в части моего Программа мне нужна для вычисления действительно сложного уравнения. Я бы использовал для этого нативный метод, потому что я знаю немного C ++ и знаю, что C ++ намного быстрее, чем Java, поэтому, если бы я написал свой метод на C ++, он был бы быстрее. Также, скажем, я хочу взаимодействовать с другой программой или устройством. При этом также использовался бы нативный метод, потому что в C ++ есть что-то, называемое указателями, что позволило бы мне сделать это.
В чем разница между встроенными и нативными методами Java?
Встроенные функции Java упоминаются в разных местах (например, здесь). Насколько я понимаю, это методы, которые обрабатываются с помощью специального нативного кода. Это похоже на метод JNI, который также является блоком собственного кода.
3 ответа
JIT знает о встроенных функциях, поэтому он может вставить соответствующую машинную инструкцию в код, который она JIT, и оптимизировать вокруг нее как часть горячей петли.
Но даже если бы это был просто вызов такой функции, как int bitcount(unsigned x) < return __builtin_popcount(x); >, скомпилированной в x86-64 popcnt eax, edi ; ret (x86-64 Соглашение о вызовах System V) вызывающая сторона (которую излучает JIT-компилятор) все равно должна была бы предположить, что все регистры, сгруппированные с вызовом, были забиты. На x86-64 это большая часть целочисленных регистров и всех регистров FP / вектора. (Точно так же, как стоимость преждевременного компилятора C ++ для вызова функции черного ящика вместо встроенного). Но я подозреваю, что стоимость вызова функции JNI включает в себя некоторые дополнительные затраты.
И, конечно, вызов любой неизвестной функции означает, что переменные, которые были в регистрах, могут быть синхронизированы с памятью, если JIT-компилятор не может доказать, что ничто другое не имеет ссылки на них. (Анализ побега.)
С тяжелым встраиванием константы времени компиляции не редкость.
Основное отличие состоит в том, что JVM знает о реализации встроенного метода и может заменить исходный java-код машинно-зависимыми хорошо оптимизированными инструкциями (иногда даже с одной инструкцией процессора), тогда как реализация метода JNI неизвестен для JVM.
Последние накладывают некоторые ограничения, такие как невозможность применения определенных методов оптимизации для методов JNI, необходимость выполнения дополнительной работы со стеком вызовов и т. Д.
Постскриптум Ссылка, которую вы предоставили, содержит список известных методов для этой конкретной JVM. Этот список может отличаться от одной JVM к другой.
Обратите внимание, что native и «встроенный» являются ортогональными:
Это похоже на метод JNI, который также является блоком собственного кода.
Русские Блоги
Нативный метод Java и практика JNI
предисловие
Если посмотреть на реализацию AndFix сегодня, метод ReplaceMethod основного метода является нативным методом, с которым раньше не сталкивался, поэтому я организую записи здесь.
Роль родной
В целом: native используется при разработке совместно с C ++! Используйте ключевое слово native, чтобы указать, что этот метод является встроенной функцией, то есть этот метод реализован на языке C / C ++ и скомпилирован в DLL, которая вызывается Java.
Введение в JNI
Нативный метод реализован JNI в Java. JNI является аббревиатурой Java Native Interface. Начиная с Java 1.1, стандарт Java Native Interface (JNI) стал частью платформы Java, которая позволяет коду Java взаимодействовать с кодом, написанным на других языках.
JNI изначально был разработан для нативных скомпилированных языков, особенно C и C ++, но он не мешает вам использовать другие языки, если поддерживается соглашение о вызовах.
В настоящее время существует три основных технологии взаимодействия между Java и DLL: jni, jawin и jacob.
С точки зрения текущей функциональности: jni >> jawin> jacob, его общая структура выглядит следующим образом:
Windows, основанная на собственной структуре PE, Windows jvm основана на собственной структуре, а система приложений Java построена на jvm. JVM косвенно вызывает целевую нативную функцию, загружая эту jni-программу.
JNI поколения шаги-Mac версия
Пример JNI
Далее мы следуем приведенным выше шагам, чтобы сгенерировать экземпляры JNI один за другим.
1. Напишите класс Java с нативным объявлением HelloWorld.java.
2. Используйте javac для генерации HelloWorld.class
Здесь следует отметить, что мы должны выполнить в корневом каталоге имя пакета, поскольку имя файла сгенерированного файла должно ссылаться на каталог пакета. В противном случае он сообщит об ошибке, что файл класса не может быть найден
Создать файл com_think_jni_HelloWorld.h
Здесь мы можем понять это следующим образом: этот h-файл эквивалентен нашему интерфейсу в Java. Здесь мы объявляем метод Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject) ;, а затем реализуем этот метод в нашем локальном методе, что означает, что мы пишем C Имя метода, используемого в программе / C ++, должно быть таким же, как здесь
4 Использование C / C ++ для реализации собственных методов
Создайте HelloWorldImpl.cpp, код выглядит следующим образом:
5 Создать динамическую библиотеку ссылок из файлов, написанных локальными методами
Но при выполнении этой команды будет ошибка
Мы нашли этот файл в
Этот каталог, поэтому мы связываем каталог с вышеуказанной командой
Наконец-то успешно сгенерирован libhell.jnilib
6 Запустите исполняемый файл
Поместив вышеуказанные файлы в одну папку, выполните
Интеллектуальная рекомендация
Spring Cloud Micro-Service Framework Set (2) Создайте поставщик услуг
Центр регистрации по строительству услуг поставщика услуг похож на После создания хорошего проекта: Bootstrap.yml Конфигурация выглядит следующим образом Eureka.client.serviceurl.defaultzone: адрес зд.
Java параллельное программирование: синхронизированный и принцип его
Оригинал: http://www.cnblogs.com/paddix/p/5367116.html Java параллельное программирование: синхронизированный и принцип его Java серия параллельного программирования: Java параллельное программировани.
Весенний проект экспортирует и запускает пакет jar
В последнее время необходимо решить проблему импорта исполняемых jar-пакетов из проектов Maven. Если проект не включает Spring, используйте mvn assembly: assembly. 1. Сначала добавьте в pom.xml: 2. За.
SLF4J Ошибка: не может разрешить метод «Информация» (Java.lang.String) ‘
проблема: Произошла ошибка при использовании @ SLF4J: не может разрешить метод «Info (Java.lang.String)», log не имеет информационного метода. Решения: Во-первых, я подозреваю, что нет пла.
Класс Python с Object Part1
1. Строка экземпляра модификации представлена, что делает результат более значимым Если вы не делаете особый процесс, общая ситуация мы распечатаем экземпляр объекта, который является результатом выхо.