为独立应用程序绑定一个 java swing gui 和 c++ 后端,它们形成两个不同的项目

Bind a java swing gui and c++ backend for a standalone application, which form two different projects

我想为独立应用程序绑定 JAVA Swing GUIC++ 后端。这两个形成两个不同的项目。我读过 Java Native 界面。虽然 JNI 似乎是最好的解决方案,但我对 JNI 有几个问题:

  1. JNI 可以帮我绑定不同的项目吗(一个在 Java swing 和其他 在 C++ 中)?
  2. 如果是,与绑定同一项目中的文件有何不同?

作为 JNI 的新手,详细的技术帮助会有所帮助。

  1. 是的。

JNI 帮助我们从 java 执行对我们自己的 C++ 库的调用。

我猜你打算让 GUI 和 C++ 在同一个进程上(如果是,JNI 是答案,如果不是,你将不得不求助于进程内通信)。

  1. 您必须动态绑定来自不同语言的项目。

Java 是托管内存,这意味着您对内存没有真正的所有权(万能的 GC 决定他是否会删除某些内容)。

C++ 是非托管内存,这意味着您将不得不自己捡垃圾。

说到这个区别,很明显,当彼此交互时,您需要确保不要从另一个中删除分配的内存。

这是您在同一项目中从绑定文件中遇到的差异之一。

另一个是您将求助于动态链接。

来自 Java 的代码被编译成中间体,而来自 C++ 的代码被编译成 CPU 特定的汇编程序。这意味着您不能将一个代码用于另一个代码。

因此我们求助于动态链接。

C++ 代码将编译成共享库(.so 或 .dll,具体取决于平台)。在运行时,您的 java Swing 应用程序(这将是入口点)会将动态库加载到程序的内存中(您需要从您的代码中手动调用它,System.loadLibrary 是函数,如果我没记错)。

加载库后,如果你正确地构建了你的库(为此你需要遵循教程,我不打算在这里解释),你将在 java.

使用 JNI 时的通常做法是创建一个桥接库,将许多 C++ 函数链接到 Java 中的桥接 class。

有自动程序可以为您创建此桥(例如 SWIG),但我强烈建议您避免使用它们(特别是因为您没有完全掌握 JNI)。