java - 如何从在 Linux 上运行的 Java 应用程序加载 native 库 (.dll)?

标签 java linux java-native-interface wine

我在 ubuntu 中有一个 java 应用程序,java 应用程序使用一个 jar。 这个 jar 使用了一些本地库 (.dll)。

System.loadLibrary("my_native_library")在jar中用来加载需要的库。

在 Linux 中,它尝试加载一个 .so 文件,这意味着这里是 my_native_library.so,但我有 my_native_library.dll。

所以我无法运行这个 java 应用程序。

我应该如何进行?

最佳答案

如果您的 .jar 文件包含一些 .dll 问题是它有几个使用 JNI(Java native 接口(interface))的模块并解决了一些基于代码的问题不是用java写的,而是用另一种系统特定的语言写的。

Windows 中的共享对象打包在扩展名为 .dll 的文件中,而 linux 中的等价物是共享对象,打包在扩展名为 .so.xxx.yyy 其中 xxx 和 yyy 是标识共享对象版本的数字。

Linux 和 Windows 可执行文件不可互换,这意味着您不能在 Linux 中运行该 .jar 文件,很可能,除非 .jar 文件还包含 .so 文件以应对 linux 执行。

编辑

通常,如果您希望启用 JNI 的 jar 文件可执行,您需要在 jar 可用之前进行一些安装。 Windows 通常将 dll 安装在某个 windows 目录中,或者如果您没有安装,它会使用 PATH 环境变量来定位 dll(因此通常情况下,程序将 dll 保留在与应用程序可执行文件相同的位置) Linux有一个完整记录的搜索共享对象的方法(有关说明,请参见 ldconfig 联机帮助页,以及 ld.so 联机帮助页),其中涉及系统库和用户共享对象。

无论如何,jar 文件仅使用 CLASSPATH 环境来定位 .class 文件,您需要使(从 jar 中提取)共享对象可见到正在使用的系统加载程序。因此,安装 JNI 共享对象的最佳方法是将其从 .jar 文件中提取出来,并将其放在操作系统将要定位的目录中。搜索引擎(两个系统不同)

请注意,windows 和 linux JNI 加载程序需要库对象的通用名称,并且它们执行系统相关部分以完成共享对象名称。这意味着对于一个名为 myshared 的共享对象,您需要在 Windows 系统中调用共享对象 myshared.dll,而 myshared.so 在 linux 中(我不确定这一点,但你会很容易地通过尝试和失败并查看 System 类和 System#loadLibrary(String) 文档)

关于java - 如何从在 Linux 上运行的 Java 应用程序加载 native 库 (.dll)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49030148/

相关文章:

linux - 如何在linux上实现写事务?全部写入或不执行任何操作

linux - 哪种双栈服务器方法更好?

java - 如何在 Linux 中查找 Java 应用程序死机的根本原因

java - Java代码转换为C -> 通过JNI调用 -> 程序停止运行

java - 无法将 db '/data/data/my.easymedi.controller/databases/EasyMediInfo.db' 的区域设置更改为 'en_US'

java - 正确的 ApplicationContext 用法?

Java数组索引越界异常排序

java - 椭圆形移动程序。椭圆不动,有什么我可以在这里炼化的吗?

java - SWIG C++ 结构到 java

Java 拖放至 native 操作系统