虽然需要一点准备,但终点就在眼前。我们已经将我们的 C++ 工具链与 Maven 结合起来,我们能够生成头文件,并且可以编译我们的代码。该项目的设置方式允许您自由地将本机方法添加到 Java 类及其后续的 C++ 实现中。
现在我们将在 Java 中调用我们的本机代码。打开 保加利亚号码数据 您的主类并添加以下代码。
var nativeObject = new MyNativeObject();
nativeObject.printToStdOut();
int 结果 = nativeObject.addNumbers(1, 1);
logger.info("来自本机代码的结果: {}", result);
MyDataObject 数据对象 = 新的 MyDataObject();
数据对象.setName(“Matthijs Kropholler”);
logger.info("运行本机代码之前获取名称:{}", dataObject.getName());
nativeObject.操作数据(数据对象);
logger.info("运行本机代码后 getName:{}", dataObject.getName());
复制
最终结果可以在这里看到。当应用程序运行时,可以看到以下内容。
恭喜,您已成功从 Java 程序中调用本机 C++ 代码。
最后的话
本文提供了一个关于如何从 Java 调用 C++ 代码以及从 C++ 调用 Java 代码的简单示例。然而,这可能无法代表现实世界的场景,因为现实世界的场景不太可能像这样简单。
这是本文中遗漏的一些内容,但在现实世界中使用时考虑这一点很重要。
复杂
表现
让我们从复杂性开始吧。正如您所看到的,与全 Java 项目相比,设置起来相当复杂,即使对于像这样的简单示例也是如此。除了 JDK 之外,您还需要在机器上安装其他工具才能使其正常工作。 C++ 编译器和 CMake。更不用说 C++ 编译器之间存在差异,每个编译器都有其优点和缺点,可能需要加以考虑。除了工具之外,您还需要使用 Maven 连接所有内容,甚至必须管理 CMake 文件,这是很多 Java 程序员不熟悉的。本机代码也无法轻松调试,如果 JNI 层出现问题,则很难进行故障排除。它必须单独进行测试。
接下来是性能。调用本机方法并不是“免费”的性能,事实上,对于简单的调用来说它非常慢! JNI 对于 Java 无法做到但 C/C++ 可以做到的事情非常有用,或者可以优化 Java 中非常缓慢的长时间运行的进程。然而,它不适合本文所示的简单使用,因为 Java 和 Native 代码之间的通信需要相关成本。
在我们的代码中添加秒表来对调用进行基准测试,在 M1 Pro MacBook 上显示以下内容。
步骤 :从 Java 调用我们的本机代码。
-
- Posts: 943
- Joined: Mon Dec 23, 2024 8:17 am