在 Java 应用程序中混合运行 32 位和 64 位本机库

Posted

技术标签:

【中文标题】在 Java 应用程序中混合运行 32 位和 64 位本机库【英文标题】:Running a mix of 32 and 64 bit native libraries in a Java application 【发布时间】:2016-03-12 02:52:49 【问题描述】:

我们正在为 Linux 开发一个桌面 Java 应用程序,该应用程序使用本地 .so 库访问一系列外围设备(USB 和串行端口预外围设备)。一些供应商仅提供 32 位库,而另一些供应商仅提供 64 位版本。由于我们需要所有外围设备在我们的应用程序中运行,我们必须找到一种方法来运行这两种架构。

我们正在使用 JNA 连接到 Linux 文件系统中的本机库。当我们在 64 位 JRE 下运行我们的软件时尝试访问 32 位库时,我们会收到以下错误消息:

java.lang.UnsatisfiedLinkError: /usr/lib/jni/libsatprotocol.so: wrong ELF class: ELFCLASS32

有没有办法在一个 JRE 中运行这两种架构?我们可以将某些 32 位 JRE 库添加到我们的 64 位 JRE 中吗?以不同的方式访问本机库是否可行?

【问题讨论】:

您应该在一个架构中编写一个最小服务,通过 REST 或基于套接字的 API 与另一个架构进行通信。您不能在同一个 JVM 中同时运行两者。 【参考方案1】:

有没有办法在单个 JRE 中运行这两种架构?

没有。他们使用不同的数据模型。

见https://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models

【讨论】:

【参考方案2】:

如果您安装一个 64 位的 JRE,您可以运行两个 JVM,一个是 32 位的,一个是 64 位的。两者都在一个 JVM 中是不可能的。

【讨论】:

以上是关于在 Java 应用程序中混合运行 32 位和 64 位本机库的主要内容,如果未能解决你的问题,请参考以下文章

ReactNative关于32位和64位SO库混合引入Crash解决方案

ReactNative关于32位和64位SO库混合引入Crash解决方案

尝试在 OS X 上为 32 位和 64 位编译 GNU 库

Studio创建64位和32位项目有啥区别

在一个程序中结合 32 位和 64 位 DLL

如何在64位windows7上同时使用32位和64位的Eclipse