【问题标题】:How to load native library (.dlls) from a java application running on linux?如何从在 linux 上运行的 java 应用程序加载本机库 (.dll)?
【发布时间】:2018-08-08 08:49:23
【问题描述】:

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

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

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

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

我应该如何进行?

【问题讨论】:

  • 无法在 Linux 系统上加载 Windows DLL...
  • 如果你在 wine 上运行 jar,这将起作用,否则将是不可能的

标签: java linux java-native-interface wine


【解决方案1】:

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

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

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

编辑

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

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

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

【讨论】:

  • 那么解决方案是什么?,如果我有一些 .dll 文件支持我的设备执行和同样的事情,我也想在我的 ubuntu 中运行它。那我该怎么办?,我需要创建单独的 .so 文件。如果您有任何想法,请指导我。
  • 可以在 .jar 存档中包含两个版本(.dll 文件和 .so 文件)...但 Linux 可能需要定义 LD_LIBRARY_PATH 环境变量,找到.so 文件。 Windows 要求它位于 PATH 目录列表中,因此在任何情况下,您都需要一些安装内容,然后才能使用共享本机对象启动 .jar 文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-18
  • 1970-01-01
相关资源
最近更新 更多