加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

JNA UnsatisfiedLinkError – 当我将java.library.path设置为伪

发布时间:2020-12-14 23:43:51 所属栏目:Java 来源:网络整理
导读:在 Linux上使用JNA 4.0.0,我试图加载一个本机库(libmean.so),它位于lib子目录中(该库只是一个计算两个数字平均值的简单示例). 我运行以下代码(在Eclipse中),在运行配置中设置了-Djna.library.path = lib. import com.sun.jna.Library;import com.sun.jna.Nat
在 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通过尝试加载其引导本机库来启动.它在各个地方搜索它,如documentation中所述.

通过使用-Djna.nosys = true标志来解决此问题,该标志强制JNA从jna.jar加载本机库,而不是从系统加载.

将java.library.path设置为无意义的值具有类似的副作用 – 它会覆盖正常的java.library.path,从而阻止加载JNA的系统版本,并从本地jna.jar返回版本.

调试设置-Djna.debug_load = true对于诊断JNA问题也很有用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读