UnsatisfiedLInkError Eclipse JNI(从命令行工作但不在Eclipse中工作)包名称

时间:2012-01-31 23:38:11

标签: java

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

当我在Eclipse中运行使用本机库的程序时,我收到了一个UnsatisfiedLinkError。

这不是一个典型的“找不到......”链接错误我相信它实际上已经找到了该文件但是还存在其他一些问题。

  

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

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

  

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

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

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

这是找到.so共享文件的问题吗?或者完全不同的东西,比如我正在使用错误的JVM。我在java命令行程序中使用了strace,看起来它正在使用我现在在Eclipse中使用的新1.7jdk,它将无法正常工作。

.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" );

所以它似乎正在加载......至少它是在没有链接错误的情况下进入print语句。当它实际上是 使用 库时,会出现UnsatisfiedLink错误。

我已经在这个问题上工作了好几周,所以如果有人对此有所了解,我会非常感激。谢谢。

3 个答案:

答案 0 :(得分: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

  

  • 如果在安全加载包含本机方法的类之后出现错误,则在调用本机方法时,请确保使用完全限定的*.h文件> javah.exe -jni -o mouse.h com.mindprod.mouse.Mouse 而不仅仅是 javah Mouse   
  • 如果在安全加载包含本机方法的类之后出现错误,则在调用本机方法时,请检查*.cpp方法签名是否与*.h中的签名完全匹配文件。您应该看到如下方法名称: Java_com_mindprod_mouse_Mouse_GetMousePosition 以Java一词开头,并包含所有串在一起的包,类和方法名称。确保你记住实现所有方法。   
  • 如果更改包名称,则需要重新生成*.h并重新编译*.c文件。

  • 你应该仔细阅读这个清单,以确保你正确地做了所有事情。

    答案 1 :(得分:0)

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

    java -version:1.6 MyClass

    答案 2 :(得分:0)

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

    然后选择JRE System库,并单击Edit以使以下屏幕进行配置 enter image description here

    相关问题