【问题标题】:Loading native libraries in java在java中加载本机库
【发布时间】:2014-07-05 20:02:08
【问题描述】:

我有一个包含两个类的 Eclipse 项目。 “SomeClass1”类有一个本地方法:

SomeClass1

public class SomeClass1 {
    static {
        System.loadLibrary("libname"); // Load the native library.
    }
    public native void some_method(); // implemented in the library
    // .... other non methods ....
}

另一个类“So​​meClass2”使用“SomeClass1”的本机方法。喜欢:

SomeClass2

public class SomeClass2{
    public static void main(String[] args) {
        SomeClass1 s = new SomeClass1();
        s.some_method();
    }
    // ....other methods....
}

但是,当它调用该方法时,它会抛出如下错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no libname in java.library.path
....
at java.lang.System.loadLibrary(Unknown Source)
at x.x.x.SomeClass1.<clinit>(SomeClass1.java:128)
at SomeClass2.main(SomeClass2.java:10)

我认为该错误与 java 不知道在哪里查找本机库有关。

问题1 当我使用: -Djava.library.path="C:\Users.....\libfolder\" 作为 eclipse 中的运行参数并打印以下值时: System.getProperty("java.library.path");我看到打印了很多目录,但没有看到我在参数中指定的目录。我做错了什么?

问题2 当我这样做时: System.loadLibrary("name");我需要调用库“name.so”还是“libname.so”?

问题3 如果找到该库但它是一个 64 位库,而它加载的平台是 32 位,它是否也会给出 unsatisfiedLinkError 或会给出不同的错误?

问题4 我可以指定相对于项目文件夹或相对于加载库的文件的库路径吗?

希望你能回答我的(部分)问题。

格兹·斯特凡

【问题讨论】:

  • 问题 2:您的示例库路径表明您在 Windows 上,所以它是 name.dll

标签: java eclipse native unsatisfiedlinkerror


【解决方案1】:

问题 1:

您不应将其添加为运行参数,而应将其添加为 VM 参数。这不是您的程序的参数,而是 JVM 的参数。

问题 2:

(也称为@IanRoberts):System.loadLibrary(name) 调用将自动从给定名称派生实际库的名称。这意味着它将在 Windows 上附加 ".dll",并在 linux 上使用 "lib" + name + ".so"。否则,将无法以独立于平台的方式加载本机库!

问题 3:

一般来说,UnsatsfiedLinkError 非常常见。事实上,这句话是对的:UnsatisfiedLinkError 只告诉你“有问题”。您只能希望实际的错误消息更具描述性,如果您有 32/64 位不匹配,这将是(幸运的是)这种情况 - 至少在 Windows 上:

  • 尝试在 64 位系统上加载 32 位库会导致消息:“无法在 AMD 64 位平台上加载 IA 32 位 .dll”
  • 尝试在 32 位系统上加载 64 位库将导致消息:“...不是有效的 Win32 应用程序”

(不过,我不确定其他操作系统的消息,但 your 消息表明该库未找到,not图书馆本身的问题)

(问题 4:我很确定这是可能的,但目前还不能绝对确定(也无法尝试)。一般来说,库必须位于通过 PATH 环境变量或通过 java.library.path 可见的路径。如果有疑问,它应该始终有效,然后本机库与您启动程序的目录位于同一目录中)

【讨论】:

  • 感谢这对我有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
  • 1970-01-01
  • 2018-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多