Как загружаются нативные методы для JDK? - PullRequest
0 голосов
/ 08 января 2019

При чтении исходного кода JDK я обнаружил, что некоторые методы являются нативными, но в их статическом блоке нет System.loadLibrary или System.load, так как же эти методы на самом деле загружаются?

Так что я думаю, что эти методы встроены в JVM. Просто удивляйтесь, как они загружаются для конкретного класса. Скажи, StrictMath. Следующим образом:

public final StrictMath {
    public static native double cos(double a);
}

Так что я могу найти исходный код этого нативного метода, просто интересно, как он загружается для этого конкретного класса.

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Привязка всех собственных методов выполняется лениво при первом вызове, если только эти методы не были явно связаны ранее вызовом функции JNI RegisterNatives .

Итак, при первом вызове нативного метода JVM просит динамический компоновщик найти символ с именем Java_package_Class_method в одной из загруженных общих библиотек. Например, в Linux вызов dlsym делает работу.

Что касается StrictMath методов, нет необходимости вызывать System.loadLibrary, потому что общая библиотека с символами StrictMath (libjava.so в Linux или java.dll в Windows) уже загружена. На самом деле JVM загружает libjava.so на ранней стадии запуска, поскольку эта библиотека содержит встроенную реализацию основных методов Java, необходимых для начальной загрузки виртуальной машины.

Проверьте, какие символы libjava.so содержит:

$ nm /usr/java/jdk-11.0.1/lib/libjava.so | grep Java_

....
00000000000146c0 T Java_java_lang_StrictMath_acos
00000000000146b0 T Java_java_lang_StrictMath_asin
00000000000146d0 T Java_java_lang_StrictMath_atan
0000000000014710 T Java_java_lang_StrictMath_atan2
0000000000014680 T Java_java_lang_StrictMath_cos
0000000000014730 T Java_java_lang_StrictMath_cosh
0000000000014770 T Java_java_lang_StrictMath_expm1
...
0 голосов
/ 08 января 2019

Я полагаю, что это ответственность Bootstrap Classloader (ответственного за загрузку ключевых классов Java из пакета java.lang), который написан на нативном коде.

...