【问题标题】:UnsatisfiedLInkError Eclipse JNI (works from command line but not in Eclipse) package namesUnsatisfiedLInkError Eclipse JNI(从命令行工作但不在 Eclipse 中工作)包名称
【发布时间】:2013-03-11 16:26:07
【问题描述】:

我可以通过键入“java main”从命令行运行程序,其中 main.java 和 main.class 以及任何相关类都位于同一目录中。这运行良好。当我尝试在 Eclipse 中运行相同的程序时,出现不满意的链接错误。我认为这与正在使用的 JVM 有关。我认为命令行 java 调用使用的是与 eclipse 不同的 JVM。如何在命令行中指定 java 使用的 JVM?

当我在 Eclipse 中运行使用本机库的程序时,出现 UnsatisfiedLinkError。

这不是典型的“找不到....”链接错误,我相信它确实找到了文件,但还有其他问题。

线程“main”中的异常 java.lang.UnsatisfiedLinkError: com.me.this.MyClass.MyMethod(Ljava/lang/String;)I

你可以看到,如果它只是找不到共享库,它会说:

线程“主”java.lang.UnsatisfiedLinkError 中的异常:java.library.path 中没有 MySharedFile.so

所以我相信它正在查找文件。

其他一些相关的问题是,如果我从命令行而不是在 Eclipse 中运行程序,它会找到 .so 并完美地运行程序。 我之前也曾在另一个使用较旧 1.6 JVM 的 Eclipse 中运行过这个程序。我曾尝试在这次日食中使用它,但没有帮助。

查找 .so 共享文件是否有问题?或者完全不同的东西,比如我使用了错误的 JVM。我在 java 命令行程序上使用了 strace,它似乎使用的是新的 1.7jdk,与我现在在 Eclipse 中使用的相同,但它不起作用。

.so 在 /usr/lib64 中,我还在运行配置的 vm 参数中创建了一个 -Djava.library.path=... 条目,以防万一。

我在负载周围添加了这些尝试捕获:

static
    {
        try{
            System.loadLibrary("MyAwesomeLibrary");
            System.out.println("MyAwesomeLibrary library loaded \n");
        }
        catch(UnsatisfiedLinkError e){
            System.out.println("Did not load library");
            e.printStackTrace();
        }

    }

我得到:

MyAwesomeLibrary library loaded 

Exception in thread "main" java.lang.UnsatisfiedLinkError: com.me.this.MyClass.MyMethod(Ljava/lang/String;)I
    at com.me.this.MyClass.MyMethod(Native Method)
    at com.me.this.Main.main(Main.java:8)

它是从一个看起来像这样的主类调用的:

public class Main
{
        public static void main( String[] args )
        {
                ClassThatContainsLoadedLIbrary x = new ClassThatContainsLoadedLibrary();
                int y = x.Ping( "thisaddress" );

所以看起来它正在加载......至少它可以在没有链接错误的情况下进入打印语句。实际尝试使用库时出现 UnsatisfiedLink 错误。

我已经研究这个问题好几个星期了,如果有人对此有所了解,我将不胜感激。谢谢。

【问题讨论】:

    标签: java


    【解决方案1】:

    看看这个:http://docs.oracle.com/javase/7/docs/api/java/lang/UnsatisfiedLinkError.html

    如果 Java 虚拟机找不到声明为 native 的方法的适当本机语言定义,则抛出此错误。

    问题不在于 JVM 本身,而在于 JVM 无法找到您的本机库。您需要指定存储本机库的路径。这可以通过在 Eclipse 中将以下内容作为参数添加到您的 JVM 来完成:

    -Djava.library.path=...
    

    来看看这个:http://mindprod.com/jgloss/runerrormessages.html#UNSATISFIEDLINKERROR

  • 如果在安全加载包含本机方法的类后收到错误,则在调用本机方法时,请确保使用完全限定的 javah.exe -jni -o mouse.h com.mindprod.mouse.Mouse 生成 *.h 文件,并且不仅仅是javah Mouse
  • 如果在安全加载包含本机方法的类后出现错误,则在调用本机方法时,请检查*.cpp 方法签名是否与*.h 文件中的签名完全匹配。您应该会看到类似这样的方法名称:Java_com_mindprod_mouse_Mouse_GetMousePosition,它以 Java 开头,包含所有串在一起的包、类和方法名称。确保您记得实现所有方法。
  • 如果更改包名,则需要重新生成*.h 并重新编译*.c 文件。
  • 您可能应该仔细阅读此列表,以确保您正确地做所有事情。

    【讨论】:

    • 谢谢,我是使用本机方法的新手。实际不满意的链接错误列出了我试图在错误本身中调用的本机方法。线程“主”java.lang.UnsatisfiedLinkError 中的异常:com.this.xda.MyClass.MyMethod()[Ljava/lang/String;即使它指定了本机方法,您是否仍然认为它找不到本机库或者它可能是其他东西。因为它在使用另一个 JVM 时在 eclipse 中工作,但是当我升级到 JDK 7 时它停止了。我尝试回到旧的 JDK 并没有帮助。
    • 问题是在你的Java代码中找到了native方法的声明,但是在native代码中找不到实现(即实现这个方法的库)。您是否在 Eclipse 中处理与使用以前的 JDK 完全相同的项目?很可能您之前的项目配置在某处指定了 java.library.path 参数,但新的没有...您检查了吗?
    • 这就是我的想法,也正要说。我不确定它是否会起作用,但尝试使用 javah 重新编译头文件,然后重新编译库。
    • @Randnum:看看我回答中的编辑。我添加了一个您可能会觉得有帮助的链接。
    • 很高兴知道它对您有用。 JNI 有时真的很痛苦。我也有过这种经历:)
    【解决方案2】:

    您应该在控制台中使用java 来查找java 选项。

    java -version:1.6 MyClass

    【讨论】:

      【解决方案3】:

      右键单击您的项目 ----> Java 构建路径 ---> 库选项卡。

      然后选择 JRE System library ,点击 Edit 会出现如下画面进行配置

      【讨论】:

      • 注意右键点击后必须点击属性。我试图添加这个缺失的信息,但由于某种原因我的编辑被拒绝了
      猜你喜欢
      • 2011-03-02
      • 1970-01-01
      • 2014-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-25
      • 2011-05-11
      相关资源
      最近更新 更多