java.* 库如何实现 Java 本机接口以使用本机方法及其功能?

How does java.* libraries implement the Java native interface to use native methods and it's functionalities?

我想知道 java.* 库是如何实现 java native interface 的?

更具体地说,我正在调查 java.awt.Robot 并遇到本地方法调用。正如我在 windows - 这是否意味着有一个 .cpp 文件放置在某个地方(在 java.awt.* 包内?) - java.awt.Robot 使用?

无论何时调用本机代码,都必须通过 JNI。通常,您需要构建共享库。调用模式如下(请注意,您不调用 C 文件 - 它只是将调用哪个方法的可视化):

因此,从某种意义上说,有一个文件包含您调用的库的源代码。

在 Windows 的情况下,共享库是 DLL 个文件,在 Linux 的情况下,它们通常是 so 个文件,在 macOS dylib 中。如果你想让它们 "visible" 成为你的 Java 代码,你在这里没有什么选择。您可以将位置(库所在的目录)放在:

  • PATH (windows)
  • LD_LIBRARY_PATH (macOS/Linux)
  • -Djava.library.path - 适用于所有系统,它只是一个 jvm 的参数。