gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 11:47:53 25 4
gpt4 key购买 nike

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

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

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

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

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

Exception in thread "main" java.lang.UnsatisfiedLinkError: no MySharedFile.so in java.library.path

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

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

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

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

我在负载周围添加了这些 try catch:

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 错误。

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

最佳答案

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

Thrown if the Java Virtual Machine cannot find an appropriate native-language definition of a method declared native.

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

-Djava.library.path=...

在这里,看看这个:http://mindprod.com/jgloss/runerrormessages.html#UNSATISFIEDLINKERROR

  • If you get the error after the class containing the native method is safely loaded, when you invoke a native method, make sure you generated your *.h file with the fully qualified javah.exe -jni -o mouse.h com.mindprod.mouse.Mouse and not simply javah Mouse
  • If you get the error after the class containing the native method is safely loaded, when you invoke a native method, check that the *.cpp method signatures exactly match those in the *.h file. You should see method names like this: Java_com_mindprod_mouse_Mouse_GetMousePosition that start with the word Java and contain the package, class and method name all strung together. Make sure you remembered to implement all the methods.
  • You need to regenerate the *.h and recompile the *.c file if you change the package name.

  • 您可能应该仔细阅读此列表以确保您正确地执行了所有操作。

    关于java - UnsatisfiedLInkError Eclipse JNI(从命令行工作但不在 Eclipse 中工作)包名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9088723/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com