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

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

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

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

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

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

线程“main”中的exceptionjava.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错误。

几个星期以来我一直在研究这个问题,所以如果有人对此有所了解,我会非常感激。 谢谢。

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

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

问题不在于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.exe -jni -o mouse.h com.mindprod.mouse.Mouse而不仅仅是javah Mouse
  • 如果在安全加载包含本机方法的类之后出现错误,则在调用本机方法时,请检查*.cpp方法签名是否与*.h文件中的签名完全匹配。 您应该看到如下方法名称: Java_com_mindprod_mouse_Mouse_GetMousePosition ,以单词Java开头,包含所有串在一起的包,类和方法名称。 确保你记得实现所有方法。
  • 如果更改包名称,则需要重新生成*.h并重新编译*.c文件。
  • 您应该仔细阅读此列表以确保正确执行所有操作。

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

    java -version:1.6 MyClass

    右键单击您的项目—-> Java Build Path —> Libraries选项卡。

    然后选择JRE System库,并单击Edit以使以下屏幕进行配置 在此处输入图像描述