我是Java和JNI的新手。这个问题也许很新。我有C ++库和Java应用程序,实习生使用JNI概念调用C ++函数。
据我了解,JVM会在调用本地函数调用之前将C ++ dll / SO加载到JVM空间中。
如果我对JVM的理解在JNI上是正确的。有人可以告诉我哪个/谁将执行JVM内部加载的C ++库函数。
假设对于C ++,存在标准的动态链接程序加载器,用于处理C ++的动态执行部分并执行所有机器指令。
如果JVM加载了JNI库(在本例中为C ++库),那么JVM是否执行那些库?如果是这样,它是否使用其内存执行本机功能?
谢谢。
答案 0 :(得分:0)
Java语言允许您将某些方法标记为native
。 Java本机接口允许您将这些Java方法链接到本机代码中的函数地址。
当您System.loadLibrary
包含本机代码的库时,JVM将执行以下两项操作:
Java_pkg_Cls_f_ILjava_lang_String_2
,并将其链接到类f
中的函数pkg.Cls
。JNI_OnLoad
(如果它存在于库中)。这样可以执行初始化,并可以选择使用registerNatives
链接更多本机方法。此后,本机库确实像其他任何库一样驻留在进程的内存空间中(例如libcurl
或libssl
)。当您实际上调用一种native
方法时,JVM将找到函数地址并使用本机call
指令跳入该函数。该函数将作为该线程的堆栈跟踪的一部分执行,并同时显示在JVM和本机堆栈跟踪中。
在更高级的情况下,该库可能会产生其他本地线程。这些功能像本机代码中的常规线程一样工作,并且对JVM不可见。如果这些线程也需要与JVM通信,则开发人员可以attach。