![](/img/trans.png)
[英]Why am I getting “UnsatisfiedLinkError: no SolarisSerialParallel in java.library.path”
[英]JNA UnsatisfiedLinkError - works when I set java.library.path to a bogus value
在Linux上使用JNA 4.0.0,我正在尝试加载一个本机库( libmean.so
),它位于lib
子目录中(该库只是一个计算两个数字平均值的简单示例)。
我运行以下代码(在Eclipse中),在运行配置中设置了-Djna.library.path=lib
。
import com.sun.jna.Library;
import com.sun.jna.Native;
public class Mean {
public interface MeanLib extends Library {
MeanLib INSTANCE = (MeanLib) Native.loadLibrary("mean", MeanLib.class);
double mean(double a, double b);
}
public static void main(String[] args) {
double result = MeanLib.INSTANCE.mean(1.0, 3.0);
System.out.println(result);
}
}
但是这失败了以下例外:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Can't obtain updateLastError method for class com.sun.jna.Native
at com.sun.jna.Native.initIDs(Native Method)
at com.sun.jna.Native.<clinit>(Native.java:139)
at com.sun.jna.examples.Mean$MeanLib.<clinit>(Mean.java:64)
at com.sun.jna.examples.Mean.main(Mean.java:72)
通过反复试验,我发现如果我也设置了java.library.path
,代码就会开始工作。
但是,无论此属性的值如何,它都可以工作。 例如,我可以设置-Djava.library.path=xxxxxxx
并继续工作。 空值也有效。
到底是怎么回事?
根本问题是系统上安装了旧版本的JNA:
$ dpkg -l | grep -i jna
ii libjna-java 3.2.7-4 Dynamic access of native libraries from Java without JNI
JNA通过尝试加载其引导本机库来启动。 它在各个地方搜索它,如文档中所述。
通过使用-Djna.nosys=true
标志来解决此问题,该标志强制JNA从jna.jar
加载本机库,而不是从系统加载。
将java.library.path
设置为无意义的值具有类似的副作用 - 它会覆盖正常的java.library.path
,从而阻止加载JNA的系统版本,并从本地jna.jar
返回版本。
调试设置-Djna.debug_load=true
对于诊断JNA问题也很有用。
$ dpkg -l | grep -i jna
尝试此命令,如果你得到这个输出
ii libjna-java 3.2.7-4 Dynamic access of native libraries from Java without JNI
或者任何其他输出然后你需要从系统中删除那个jna,因为如果程序本身有jna jar,那么就不需要系统jna了。 做这样的事情。
sudo apt-get autoremove libjna-java
并尝试再次重新启动该应用程序。 它将运行并且它没有运行然后尝试安装新版本的libwebkit-gtk 。
希望这会有所帮助。 这对我有帮助。
当我通过apt-get安装了Netbeans 7时出现了这个错误,这是在libjna-java(3.2.7-4)中引入的。
由于Netbeans 7已经过时,我在删除debian软件包后通过shell安装程序安装了版本8。 一定要自动去除libjna。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.