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