gpt4 book ai didi

java - 使用 JNI 调用 C++ 库函数以及哪个进程执行该 C++ 库

转载 作者:行者123 更新时间:2023-12-02 03:38:58 25 4
gpt4 key购买 nike

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

根据我的理解,JVM 在调用 native 函数之前会在 JVM 空间中加载 C++ dll/SO。

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

如果 JVM 加载了 JNI 库(在本例中为 C++ 库),JVM 是否执行这些库?如果是这样,它是否使用其内存来执行 native 函数?

提前致谢。

最佳答案

Java 语言允许您将某些方法标记为 native 。 Java native 接口(interface)允许您将这些 Java 方法链接到 native 代码中的函数地址。当您System.loadLibrary包含 native 代码的库时,JVM 将执行两件事:

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

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

在更高级的情况下,库可能会生成额外的 native 线程。它们的工作方式类似于 native 代码中的常规线程,并且对 JVM 不可见。如果这些线程也需要与 JVM 通信,开发人员可以 attach他们。

关于java - 使用 JNI 调用 C++ 库函数以及哪个进程执行该 C++ 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56846700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com