gpt4 book ai didi

Java 回调到 C++ 从 C++ 回调

转载 作者:行者123 更新时间:2023-11-27 22:37:11 44 4
gpt4 key购买 nike

关于如何使用 JNI 从 C++ 调用 Java 代码的文章和问题数不胜数,我可以做到,我可以从 C++ 调用一些 Java 函数。

现在我找不到任何信息如下:

假设我有一个 Java 函数,需要传递给它的回调函数。此回调函数在稍后的某个时间点从不同的线程调用。

现在我想从 C++ 程序中调用这个函数,一旦调用了回调函数,我就想调用一个 C++ 回调。任何人都可以指出有关如何执行此操作的信息来源吗?

背景是我想在现有的 C++ 项目中使用 Java 库(全部在 Linux 上,尽管我怀疑这是否相关)。通过 JNI 调用 Java 函数的开销在这里不是问题。

最佳答案

你是对的,不知怎么的,这方面的文档不容易找到。但我仍然记得以前的项目中我这样做的方式。您将不得不阅读一些免费提供的在线文档来尽自己的一份力量,因为我可能会遗漏一些细节。我将在本文末尾为您提供链接。

因此,如果我的理解是正确的,您想从 Java 调用 native C++ 函数。首先记住 Java Native Interface 不是 C++ 而是 C。这就像大多数高级编程语言的 native 接口(interface)(到目前为止我所见过的所有接口(interface))。

  1. 创建 native 界面的 Java View 。那就是创建一个 Java 类并声明 native 方法。有关键字 native你可以用它。您不提供任何实现,只是声明它。

  2. 使用 javac -h生成 native 头文件。阅读该工具的文档。在 Java 7 中,有一个名为 javah 的单独工具。 .但是对于当前的 Java 11,您应该使用 javac .

  3. 使用 C 或 C++ 为生成的 header 中声明的函数提供实现。编译并将它们链接到共享对象(*.so*.dll)。

  4. 在您的 Java 应用程序运行时通过调用从您的新库中加载您的 native 代码:

    System.load("库路径");

如果您的 native 函数已加载到当前进程中,则不必执行最后的第 4 步。如果您要在 CPP 应用程序中嵌入 Java 应用程序,那就是这样。在那种情况下,您可能需要查看 RegisterNatives .

Java 关键字的文档 native :

JNI 的文档在这里:

另请参阅 Java 编译器的文档以了解如何生成 native header 。寻找选项 -h :

.

编辑

今天我比昨天更理解你的问题:

  • 您有一个嵌入了 Java 应用程序的 C++ 应用程序。
  • 您想从 C++ 调用 Java 方法。
  • 调用时你想传递一个回调方法。
  • 当 Java 方法完成时,它必须调用您之前传递给它的回调方法。

好的,加上你已经知道的,再加上我上面给出的解释,就可以做到了。它实际上可以用不同的方式再次完成。我将解释一个简单的:

您的 C++ 应用已经知道在 Java 方法完成时需要调用哪个回调。当您调用 Java 方法时,您将回调作为 key 提供给它。 .您已经知道如何从 C++ 调用 Java 方法。这key可以是任何东西。为简单起见,keyuintptr_t ,指针大小的整数。在这种情况下,我们只需将函数指针作为回调传递给 Java 方法。

但 Java 不能通过取消引用整数/指针来调用回调。现在您调用 native extern "C"函数并给它 key作为参数。我在上面解释了如何从 Java 调用 native 函数。该原生函数现在只需要将该整数转换回一个指针:( reinterpret_cast<>() ) 并调用您的回调。当然, native 函数可以接受除 key 之外的其他参数。到回调,如果有一些数据你想传递给你的回调。

我觉得现在思路很清晰了。

如果你想拥有更多的可移植代码,那么不要使用回调地址作为键。而是使用整数甚至字符串并使用 std::map将该键映射到您的真实回调。但只是从那个简单的例子开始。当它起作用时,很容易改进它。大多数工作将设置项目和工具以协同工作。

关于Java 回调到 C++ 从 C++ 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52820549/

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