使用JNI调用C ++库函数,哪个进程执行该C ++库

时间:2019-07-02 06:42:06

标签: java c++ java-native-interface

我是Java和JNI的新手。这个问题也许很新。我有C ++库和Java应用程序,实习生使用JNI概念调用C ++函数。

据我了解,JVM会在调用本地函数调用之前将C ++ dll / SO加载到JVM空间中。

如果我对JVM的理解在JNI上是正确的。有人可以告诉我哪个/谁将执行JVM内部加载的C ++库函数。
假设对于C ++,存在标准的动态链接程序加载器,用于处理C ++的动态执行部分并执行所有机器指令。

如果JVM加载了JNI库(在本例中为C ++库),那么JVM是否执行那些库?如果是这样,它是否使用其内存执行本机功能?

谢谢。

1 个答案:

答案 0 :(得分:0)

Java语言允许您将某些方法标记为native。 Java本机接口允许您将这些Java方法链接到本机代码中的函数地址。 当您System.loadLibrary包含本机代码的库时,JVM将执行以下两项操作:

  • 寻找specifically named functions,例如Java_pkg_Cls_f_ILjava_lang_String_2,并将其链接到类f中的函数pkg.Cls
  • 调用JNI_OnLoad(如果它存在于库中)。这样可以执行初始化,并可以选择使用registerNatives链接更多本机方法。

此后,本机库确实像其他任何库一样驻留在进程的内存空间中(例如libcurllibssl)。当您实际上调用一种native方法时,JVM将找到函数地址并使用本机call指令跳入该函数。该函数将作为该线程的堆栈跟踪的一部分执行,并同时显示在JVM和本机堆栈跟踪中。

在更高级的情况下,该库可能会产生其他本地线程。这些功能像本机代码中的常规线程一样工作,并且对JVM不可见。如果这些线程也需要与JVM通信,则开发人员可以attach