如何从 linux 上的 java 应用程序 运行 加载本机库 (.dll)?

How to load native library (.dlls) from a java application running on linux?

我在 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 本机接口)并解决了一些基于代码的问题,而不是用 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 文件中提取出来,并将其放入 O.S 所在的目录中。搜索引擎(两个系统不同)

请注意,windows 和 linux JNI 加载程序需要库对象的通用名称,并且它们执行系统相关部分以完成共享对象名称。这意味着对于像 myshared 这样调用的共享对象,您需要在 windows 系统中调用共享对象 myshared.dll,在 linux 中调用 myshared.so (我不确定这一点,但您可以通过尝试和失败并查看 System class 和 System#loadLibrary(String) 文档轻松获得它)