繁体   English   中英

UnsatisfiedLinkError:java.library.path中没有libhello

[英]UnsatisfiedLinkError: no libhello in java.library.path

我正在编写有关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 

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM