Steve
Steve

Reputation: 37

UnsatisfiedLinkError: no libhello in java.library.path

I'm doing a tutorial about JNI to get comfortable with it for my project. However, I'm stuck on this particular part of the tutorial which is running the Java program. I'm using Eclipse where I've created a Java project and put the files inside a package. When I try to follow the tutorial without using Eclipse, I get no errors, so I assume it's a path related issue.

As for my error, I get an

UnsatisfiedLinkError: no libhello in java.library.path

when I run this in my terminal:

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

Even when I specify my path, it doesn't work. If you want to reproduce my steps, here's what I did:

  1. After creating HelloJNI.java, I ran the following in the terminal:

    javac -h . HelloJNI.java
    

This command created the generated header file given below.

  1. After this, I wrote HelloJNI.c, navigated to the package folder and then compiled it using this command in the same directory:

     gcc -fPIC -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" -shared -o libhello.so HelloJNI.c
    
  2. Then I moved up one directory to ~/eclipse-workspace/HelloJNI/src and ran this command:

     java -Djava.library.path=. HelloJNI
    

Which yields the error described above.

Here's my code:

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 

I have also tried setting the path to my working directory, but I still get the same result. What am I doing wrong?

Upvotes: 2

Views: 951

Answers (1)

Alex Cohn
Alex Cohn

Reputation: 57203

I moved up one directory to ~/eclipse-workspace/HelloJNI/src

This means that your libhello.so is in ~/eclipse-workspace/HelloJNI/src/helloJNI directory, isn't it?

Now, to let Java find this library, run

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

or use the absolute path

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

Upvotes: 0

Related Questions