在 Java 中调用本机代码

Learn, share, and connect around europe dataset solutions.
Post Reply
roseline371274
Posts: 939
Joined: Mon Dec 23, 2024 8:20 am

在 Java 中调用本机代码

Post by roseline371274 »

Java 因其可移植性而闻名。无论 Java 虚拟机 (JVM) 在哪里运行,您的代码也会在哪里运行。
然而,在某些情况下可能需要调用本机编译的代码。
这可以是与本机库交互、处理硬件,甚至可以提高密集进程的性能。
人们考虑这样做的原因有很多。虽然我没有以任何有意义的方式使用这项技术,但它确实在现实世界中使用。例如,Google 在 Android 的部分功能(即蓝牙)中使用它。

Java 开发工具包 (JDK) 提供了一种称为 Java 本机接口 (JNI) 的方法来 保加利亚号码数据 弥合 JVM 中运行的字节码与您需要交互的任何本机代码之间的差距。

我们要做什么?
我们将编写一个使用 JNI 的简单 C++ 库,将其导入 Java 应用程序并在 Java 程序中调用该库中的本机函数。确实很简单,不是吗?

所以。它是如何工作的?
首先,本机代码必须作为共享库加载到 JVM 中。
简单来说,共享库是一个外部文件,其中包含在启动时加载到程序中的本机代码,以便程序可以调用其方法。
您可能之前见过这些文件。在 Windows 机器上,它们具有“.dll”扩展名,而在 Linux 上,它们具有“.so”扩展名。
在本文中,我们创建一个简单的共享库并展示如何从 Java 程序中调用它。

需要什么?
– Java
– C/C++ 编译器 (gcc)
– CMake

步骤 1:Java
像平常一样创建一个 Java 项目。
接下来,通过静态块加载库。这确保如果可以找到该库则加载它。
请记住,由于程序正尝试在静态块中加载库文件,因此如果没有该文件,程序将无法启动。
或者,共享库可以在我们的程序中的任何位置加载,但这是我的首选方法,因为它可以确保在程序成功启动时加载该库。

注释:
公共类 JniArticleApplication 实现 CommandLineRunner {
静止的 {
最终String userDirectory = System.getProperty("user.dir"); // 这将获取当前工作目录。这是应用程序当前正在运行的目录。
最终字符串sharedLibsDirName =“sharedlibs”; // 我们的共享库存储的目录
最终字符串共享库名称 = System.mapLibraryName("my_native_library"); // 这将库名称映射到平台特定的名称。在 MacOS 上,它映射到 libmy_native_library.dylib

// 如果找不到库,程序将无法启动
System.load(Paths.get(userDirectory,sharedLibsDirName,sharedLibraryName).toString());
}
}
复制
接下来,创建两个新类。一个包含本机方法,另一个将用作数据类。
首先,创建数据类,因为这是最简单的。在示例中,使用了包含名称的简单类。
Post Reply