gpt4 book ai didi

java - JNA UnsatisfiedLinkError - 当我将 java.library.path 设置为虚假值时有效

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:47:07 24 4
gpt4 key购买 nike

在 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 通过尝试加载其引导 native 库来启动。它在不同的地方搜索它,如 documentation 中所述。 .

这个问题通过使用 -Djna.nosys=true 标志来解决,它强制 JNA 从您的 jna.jar 加载 native 库,而不是从系统.

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

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

关于java - JNA UnsatisfiedLinkError - 当我将 java.library.path 设置为虚假值时有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21679004/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com