【发布时间】:2012-02-02 22:04:35
【问题描述】:
tl;dr:C++ 插件需要调用 Java .jar 库。如何将其部署给用户而不会让人头疼?
我正在为一个 Qt 应用程序编写一个 Qt 插件。该插件需要调用现有的 Java 库。这需要跨平台(Win、Mac、Linux)和架构(32 位和 64 位 Intel,无 PPC)工作。
我编译并运行了一个简单的“hello world”JNI 示例。我将 CMake 脚本更新为“find_package(JNI REQUIRED)”等,因此它针对 jni.h 标头进行编译并动态链接到 JVM 库。
至少在 Windows 上,CMake 可以很好地找到在编译时使用的正确 JVM。我担心的是在运行时找到正确的 JRE(jvm.dll 等),因为我对用户计算机的控制较少。
当我将插件发送给我的用户时,它将如何工作?他们需要为正确的架构安装 JRE。但这并不意味着 JRE lib 目录将在他们的路径中。如果不是,插件就会退出并且不会加载。
在Windows上,64位JDK安装jvm.dll到:
C:\Program Files\Java\jre7\bin\server\jvm.dll
但是 32 位的 JDK 安装到:
C:\Program Files (x86)\Java\jre7\bin\client\jvm.dll
我了解 PF 与 PFx86 的区别,但我不明白服务器/客户端的东西。这些实际上是不同的 JRE 吗?
如果我针对一个 JRE 版本编译/链接并且用户有不同的版本,它会起作用吗?
我认为这在 Linux/Mac 上会更容易,但我还没有做到这一点。
感谢任何帮助。我不喜欢使用 JNI,但买不起 2000 美元的编译器来将 Java 变成本机代码库(反正我没有源代码),我听说 gcj 可能无法胜任这项任务(可能在 Windows 上没有多大帮助)。
【问题讨论】:
-
您可以使用您的应用程序部署自己的 jre,我想这将是解决您的问题的最简单方法。这样您就可以确保您的本地库与 jre 一起使用,并且您不必为 dll 查找问题而苦恼。
-
我认为许可证问题会阻止我部署自己的 JRE。关于如何做到这一点的任何建议?此外,在这种情况下,我可以控制应用程序,但假设我没有并且只是在编写插件怎么办?
-
我以前从未这样做过,我只是在考虑 Open Office。如果我没记错的话,他们有一个包含 jre 的安装选项。如果您只是部署一个插件,我想您将不得不编写一个安装脚本,以确保使用正确的版本安装 java 并设置您的路径变量。
-
@Dan,插件是怎么安装的或者有什么配置?
-
@hmjd,在 Windows 上,它只是一个被复制到特定于应用程序的插件目录的 .dll。在 Mac/Linux 上基本相同,除了用户从源代码编译插件并将生成的 .so 或 .dylib 复制到位。
标签: java c++ qt plugins java-native-interface