不满意的链接错误:java.library.path中没有libhello

不满意的链接错误:java.library.path中没有libhello,java,c,linux,eclipse,java-native-interface,Java,C,Linux,Eclipse,Java Native Interface,我正在做一个关于JNI的教程,以便在我的项目中熟悉它。然而,我仍停留在教程的这一部分,即运行Java程序。我正在使用Eclipse,在Eclipse中我创建了一个Java项目,并将文件放在一个包中。当我尝试在不使用Eclipse的情况下遵循教程时,我没有收到任何错误,因此我假设这是一个与路径相关的问题 至于我的错误,我得到了一个 不满意的链接错误:java.library.path中没有libhello 当我在终端中运行此命令时: java -Djava.library.path=. hello

我正在做一个关于JNI的教程,以便在我的项目中熟悉它。然而,我仍停留在教程的这一部分,即运行Java程序。我正在使用Eclipse,在Eclipse中我创建了一个Java项目,并将文件放在一个包中。当我尝试在不使用Eclipse的情况下遵循教程时,我没有收到任何错误,因此我假设这是一个与路径相关的问题

至于我的错误,我得到了一个

不满意的链接错误:java.library.path中没有libhello

当我在终端中运行此命令时:

java -Djava.library.path=. helloJNI.HelloJNI
javac -h . HelloJNI.java
即使我指定了路径,它也不起作用。如果你想重现我的步骤,下面是我所做的:

  • 创建
    HelloJNI.java
    后,我在终端中运行了以下操作:

    java -Djava.library.path=. helloJNI.HelloJNI
    
    javac -h . HelloJNI.java
    
  • 此命令创建了生成的头文件,如下所示

  • 在此之后,我编写了
    HelloJNI.c
    ,导航到package文件夹,然后在同一目录中使用以下命令对其进行编译:

     gcc -fPIC -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" -shared -o libhello.so HelloJNI.c
    
  • 然后我将一个目录上移到
    ~/eclipse workspace/HelloJNI/src
    ,并运行以下命令:

     java -Djava.library.path=. HelloJNI
    
  • 这将产生上述错误

    这是我的密码:

    HelloJNI.java

    package helloJNI;
    
    public class HelloJNI {  // Save as HelloJNI.java
           static {
              System.loadLibrary("hello"); // Load native library hello.dll (Windows) or libhello.so (Unixes)
                                           //  at runtime
                                           // This library contains a native method called sayHello()
           }
    
           // Declare an instance native method sayHello() which receives no parameter and returns void
           private native void sayHello();
    
           // Test Driver
           public static void main(String[] args) {
              new HelloJNI().sayHello();  // Create an instance and invoke the native method
           }
        } 
    
    HelloJNI.c

    // Save as "HelloJNI.c"
    #include <jni.h>        // JNI header provided by JDK
    #include <stdio.h>      // C Standard IO Header
    #include "helloJNI_HelloJNI.h"   // Generated
    
    // Implementation of the native method sayHello()
    JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj) {
       printf("Hello World!\n");
       return;
    }
    
    //另存为“HelloJNI.c”
    #包括//JDK提供的JNI头
    #include//C标准IO头
    #包括“helloJNI_helloJNI.h”//Generated
    //本机方法sayHello()的实现
    JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv*env,jobject thisObj){
    printf(“你好,世界!\n”);
    返回;
    }
    
    helloJNI_helloJNI.h

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class helloJNI_HelloJNI */
    
    #ifndef _Included_helloJNI_HelloJNI
    #define _Included_helloJNI_HelloJNI
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     helloJNI_HelloJNI
     * Method:    sayHello
     * Signature: ()V
     */
    JNIEXPORT void JNICALL Java_helloJNI_HelloJNI_sayHello
      (JNIEnv *, jobject);
    
    #ifdef __cplusplus
    }
    #endif
    #endif 
    
    /*不要编辑此文件-它是机器生成的*/
    #包括
    /*helloJNI_helloJNI类的标题*/
    #如果没有,包括helloJNI和helloJNI
    #定义(包括)helloJNI(包括)
    #ifdef_uucplusplus
    外部“C”{
    #恩迪夫
    /*
    *类别:helloJNI_helloJNI
    *方法:你好
    *签字:()五
    */
    JNIEXPORT void JNICALL Java_helloJNI_helloJNI_sayHello
    (JNIEnv*,jobject);
    #ifdef_uucplusplus
    }
    #恩迪夫
    #恩迪夫
    
    我也尝试过设置工作目录的路径,但仍然得到相同的结果。我做错了什么

    我向上移动了一个目录到
    ~/eclipseworkspace/HelloJNI/src

    这意味着您的libhello.so位于
    ~/eclipse workspace/HelloJNI/src/HelloJNI
    目录中,不是吗

    现在,要让Java找到这个库,请运行

    java -Djava.library.path=helloJNI helloJNI.HelloJNI
    
    或者使用绝对路径

    java -Djava.library.path=~/eclipse-workspace/HelloJNI/src/helloJNI helloJNI.HelloJNI
    

    是的,我的libhello.so文件在helloJNI目录中。我试过你的建议。它似乎解决了这个问题,但我得到了一个不同的错误。现在它说:错误:找不到或加载主类HelloJNI,原因是:java.lang.ClassNotFoundException:HelloJNI不幸的是,即使有前缀,错误仍然存在。您应该在当前目录为
    ~/eclipse workspace/HelloJNI/src
    时运行此命令,但是从
    ~/eclipseworkspace/HelloJNI/src
    运行命令会产生旧的错误。我还尝试通过添加我的工作区目录来编辑我的
    LD\u LIBRARY\u路径
    ,不过运气不好。嗨,我找到了答案。我忘了在C文件内的函数中添加包名。。。令人尴尬的无论如何,谢谢你的帮助。