我在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可执行文件不可互换,这意味着您.jar
最有可能.jar
也可以在linux中运行该文件,除非该文件还包含.so
可应对linux执行的文件。
通常,如果您希望可执行JNI的jar文件可执行,则在jar可用之前,需要进行一些安装。Windows通常会在某些Windows目录中安装dll,或者,如果尚未完成安装,它会使用PATH
环境变量来定位dll(因此,通常,程序会将dll与应用程序可执行文件放在同一位置)Linux具有完全记录的搜索共享文件的方式对象(ldconfig
有关说明,另请参见手册页ld.so
),其中涉及系统库和用户共享的对象。
无论如何,jar文件仅使用CLASSPATH
环境来定位.class
文件,并且您需要使(从jar中提取)共享对象对使用中的系统加载程序可见。因此,安装 JNI共享对象的最好方法是从.jar文件中提取它,并将其放在OS搜索引擎将在其中定位的目录中(两个系统都不同)
请注意,Windows和Linux JNI加载程序需要库对象的通用名称,它们会依赖于系统,以完成共享库名称。这意味着对于名为like myshared
的共享库,您需要myshared.dll
在Windows系统和myshared.so
linux中调用共享库(我不确定,但是您可以通过试用和失败轻松地找到它,并查看System
类和System#loadLibrary(String)
文档)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句