【发布时间】: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