UnsatisfiedLinkError:java.library.path中没有libhello

时间:2019-01-09 16:31:48

标签: java c linux eclipse java-native-interface

我正在编写有关JNI的教程,以使其适合我的项目。但是,我被困在运行Java程序的教程的这一特定部分。我在使用Eclipse的地方创建了Java项目,并将文件放在包中。当我尝试不使用Eclipse而按照本教程进行操作时,没有任何错误,因此我认为这是与路径相关的问题。

关于我的错误,我得到了

  

UnsatisfiedLinkError:java.library.path中没有libhello

当我在终端上运行此程序时

java -Djava.library.path=. helloJNI.HelloJNI

即使我指定了路径,它也不起作用。如果您想重现我的步骤,请按照以下步骤操作:

  1. 创建HelloJNI.java后,我在终端中运行了以下命令:

    javac -h . HelloJNI.java
    

此命令创建了下面给出的生成的头文件。

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

     gcc -fPIC -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" -shared -o libhello.so HelloJNI.c
    
  2. 然后我将一个目录上移到~/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_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 

我也尝试过设置工作目录的路径,但仍然得到相同的结果。我在做什么错了?

1 个答案:

答案 0 :(得分:0)

  

我将一个目录上移到~/eclipse-workspace/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