如何根据运行应用程序的系统加载不同的本机库(dll,so)

时间:2014-06-11 21:53:47

标签: java jvm java-native-interface classloader

我有一个使用JNI调用的本机库。调用本机库在Linux中运行良好。

我的问题是,如果我为Linux和Windows创建一个.so.dll文件并将它们添加到项目中,有没有办法根据操作系统加载正确的库我的应用程序是在呼叫System.LoadLibrary("myLib")时运行?

换句话说,下面的伪代码的正确实现是什么?

if(Windows){
   System.LoadLibrary("myLib.dll");
}else if(Linux){
   System.LoadLibrary("myLib.so");
}

由于

2 个答案:

答案 0 :(得分:2)

相反,在Windows上

System.loadLibrary("myLib");

将加载 myLib.dll ,但在* x上它等同于

System.load(path + "/libmyLib.so");

部署和路径管理将取决于平台,但loadLibrary()是“代码一次,随处运行”。

答案 1 :(得分:0)

它有点复杂,这个loadNativeLibrary() method中有一个完整的例子。

一些注意事项:

首先尝试使用System.loadLibrary(libName),以便可以将库外部化。大多数Linux软件包都希望这样做。

您需要在jar中设置一些arch和操作系统本机文件存储方法。该示例使用一些帮助程序类来规范化拱名称。请参阅NativeSystem

OS X上的早期Java版本决定用于JNI的动态库应该像系统上的每个其他动态库一样使用jnilib扩展而不是dylib。你可能需要解决这个问题。

确保将本机库解压缩到唯一的文件路径。当你有并发应用程序将你的天真库的不同版本提取到相同的位置和文件名时,它总是很有趣。

使用System.load()而不是System.loadLibrary()来加载提取的二进制文件。这样你就不必担心java.library.path。