«Собственный» метод - это широкий термин, означающий, что этот метод реализован либо в самой JVM, либо в динамически загруженной собственной библиотеке.
native
- это метод, который объявлен как native
в исходном коде Java класса.
«Встроенный» метод - это метод, для которого среда выполнения JVM (в частности, JIT-компилятор) выполняет специальную оптимизацию.Одна из вещей, которая означает «внутренняя», заключается в том, что последовательность вызовов не является вызовом JNI.Но оптимизации могут быть более обширными, чем это.
Обратите внимание, что native
и "intrisic" являются ортогональными:
- Метод может быть как
native
, так и "intrinsic";например arraycopy
.Метод, который является одновременно native
и "внутренним", (как правило) не будет реализован как метод JNI. - Метод может быть "внутренним", не будучи
native
;например, некоторые String
методы в некоторых версиях Java.В этом случае исходный код Java и его байт-коды игнорируются в JIT-скомпилированной версии метода.
Это похоже на метод JNI, который также является блокомнативный код.
JNI - это API для реализации native
методов, которые не являются «внутренними».Таким образом, метод JNI - это метод, реализованный в C / C ++, с сигнатурой, совместимой с вызывающей последовательностью JNI.
Проблема состоит в том, что последовательность вызова метода JNI имеет больший вес, чем типичный Java-to-Java или внутренняя последовательность вызова Java.(Это связано с общим характером вызова JNI и необходимостью проверять и отображать аргументы / результаты между Java соответствующими типами C / C ++ ... и тому подобными вещами.)
Другая проблема с JNIметоды по сравнению с Java и встроенные методы таковы, что JIT-компилятор не знает, что делают первые, и поэтому не может применять различные оптимизации через границу вызова;например, встраивание.