java.lang.UnsatisfiedLinkError when using JNI on ubuntu

mancook

java.lang.UnsatisfiedLinkError when using JNI.

My Testing Environment:

Ubuntu 12.04/64-bit
JDK 1.7
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5)

This is my java source:

public class HelloJNI {
    static {
        //System.loadLibrary("libHelloJNI");
    }

    private native void sayHello() ;

    public static void main(String[] args){
        //System.getProperties().list(System.out);
        String lib_path = System.getProperty("java.library.path");
        System.out.println("java.library.path=" + lib_path);

        System.loadLibrary("libHelloJNI");

        HelloJNI myJNI = new HelloJNI();
        myJNI.sayHello();
    }
}

This is my C source:

#include <stdio.h>
#include "HelloJNI.h"

JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj)
{
    puts("Hello Momo. This is C code.");
    return;
}

This is my Makefile:

JNI_INC=-I"${JAVA_HOME}/include" -I"${JAVA_HOME}/include/linux"

JNI_LIB=libHelloJNI.so
JNI_OUT=$(JNI_LIB) HelloJNI.h HelloJNI.class
CFLAGS= $(JNI_INC) -fPIC -shared

all: $(JNI_OUT)

HelloJNI.h: HelloJNI.class
    javah -jni HelloJNI

$(JNI_LIB): HelloJNI.c HelloJNI.h
    gcc $(CFLAGS) -o $@  HelloJNI.c

HelloJNI.class: HelloJNI.java
    javac HelloJNI.java

run:
    java  HelloJNI
    #java -Djava.library.path=. HelloJNI

clean:
    rm $(JNI_OUT) 

When i run the java app, the OLD problem occurs:

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8 java.library.path=.:/home/mancook/cook/work/StSoftware/src/java/StTestJni/tutor01_HelloJNI:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
Exception in thread "main" java.lang.UnsatisfiedLinkError: no libHelloJNI in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1886)
at java.lang.Runtime.loadLibrary0(Runtime.java:849)
at java.lang.System.loadLibrary(System.java:1088)
at HelloJNI.main(HelloJNI.java:22)
make: *** [run] Error 1

I have googled internet for this problem and find that it is an OLD question. But I CANNOT find any method to fix my problem!! Hope someone can help me. Thanks in advance.

Christian Hujer

You need -Djava.library.path=. in the Makefile, and you need to load the library with System.loadLibrary("HelloJNI"); - no lib prefix, no .so suffix. The prefix and suffix are handled by Java - think of it, naming scheme on Windows is different (stupid but fact). And beware of the pitfall that you have System.loadLibrary() twice in your code, if you change only one of them, it will still fail. That one actually had cost me a few minutes :P

P.S.: I suggest a few changes to your Makefile. I would use $(RM) instead of rm. Goals which are not files should be declared .PHONY. Variables which do not refer to automatic variables can be assigned with := instead of =. I would use a separate step for creating the .so from the .o file. I would use a pattern rule for compiling Java, like %.class: %.java. I would use a pattern rule for creating the header file, like %.h: %.class. The -I stuff should be in CPPFLAGS not CFLAGS because it's for the preprocessor. The -shared should then go into LDFLAGS and so on...

Here's your new Makefile:

CPPFLAGS:=-I"${JAVA_HOME}/include" -I"${JAVA_HOME}/include/linux"

JNI_LIB:=libHelloJNI.so
JNI_OUT:=$(JNI_LIB) HelloJNI.o HelloJNI.h HelloJNI.class
CFLAGS:=-fPIC
LDFLAGS:=-shared

.PHONY: all
all: $(JNI_OUT)

%.h: %.class
    javah -jni HelloJNI

$(JNI_LIB): HelloJNI.o
    $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@

HelloJNI.o: HelloJNI.c HelloJNI.h

%.class: %.java
    javac HelloJNI.java

.PHONY: run
run:
    java -Djava.library.path=. HelloJNI

.PHONY: clean
clean:
    $(RM) $(JNI_OUT)

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

From Dev

JNI java.lang.UnsatisfiedLinkError

From Dev

JNI : Get java.lang.UnsatisfiedLinkError

From Dev

java.lang.UnsatisfiedLinkError exception when using TESSERACT API in Java

From Dev

How to resolve UnsatisfiedLinkError when using JNI with packages?

From Dev

java.lang.UnsatisfiedLinkError when using with android 5.0

From Dev

JNI- java.lang.UnsatisfiedLinkError: Native method not found

From Dev

ECLIPSE - java.lang.UnsatisfiedLinkError while working with JNI

From Dev

JNI java.lang.UnsatisfiedLinkError,cannot link method

From Dev

java.lang.UnsatisfiedLinkError when using third party library in storm toplogy

From Dev

java.lang.UnsatisfiedLinkError when /tmp mounted as noexec while using Mongo CSFLE (mongodb-crypt)

From Dev

UnsatisfiedLinkError in Java, coming from JNI

From Dev

java.lang.UnsatisfiedLinkError: no kdu_jni in java.library.path

From Dev

java.lang.UnsatisfiedLinkError when running java command as sudo

From Dev

AndroidRuntime Caused by: java.lang.unsatisfiedLinkError: Couldn't load tfp_jni: findLibrary returned null

From Dev

Android Java NDK/JNI - UnsatisfiedLinkError: Native method not found [...] Ljava/lang/String;

From Dev

jni4net - java.lang.UnsatisfiedLinkError: net.sf.jni4net.Bridge.initDotNet()I

From Dev

java.lang.UnsatisfiedLinkError when loading native library in Android 5.0

From Dev

JSNI in GWT makes java.lang.UnsatisfiedLinkError when called

From Dev

java.lang.UnsatisfiedLinkError - when running z/OS application

From Dev

Using JavaCV and Realm together causes "java.lang.UnsatisfiedLinkError"

From Dev

JNI C++ UnsatisfiedLinkError When Calling Method

From Dev

JNI C++ UnsatisfiedLinkError When Calling Method

From Dev

UnsatisfiedLinkError with JNI

From Dev

OpenCV java.lang.UnsatisfiedLinkError

From Dev

eclipse: java.lang.UnsatisfiedLinkError

From Dev

UnsatisfiedLinkError when running SimGrid-Java example on Ubuntu

From Dev

java.lang.UnsatisfiedLinkError: No implementation found for java.lang.String when proguard enabled

From Dev

java.lang.UnsatisfiedLinkError: TestJni.print(LA;)V error on Ubuntu

From Dev

java.lang.UnsatisfiedLinkError: TestJni.print(LA;)V error on Ubuntu

Related Related

  1. 1

    JNI java.lang.UnsatisfiedLinkError

  2. 2

    JNI : Get java.lang.UnsatisfiedLinkError

  3. 3

    java.lang.UnsatisfiedLinkError exception when using TESSERACT API in Java

  4. 4

    How to resolve UnsatisfiedLinkError when using JNI with packages?

  5. 5

    java.lang.UnsatisfiedLinkError when using with android 5.0

  6. 6

    JNI- java.lang.UnsatisfiedLinkError: Native method not found

  7. 7

    ECLIPSE - java.lang.UnsatisfiedLinkError while working with JNI

  8. 8

    JNI java.lang.UnsatisfiedLinkError,cannot link method

  9. 9

    java.lang.UnsatisfiedLinkError when using third party library in storm toplogy

  10. 10

    java.lang.UnsatisfiedLinkError when /tmp mounted as noexec while using Mongo CSFLE (mongodb-crypt)

  11. 11

    UnsatisfiedLinkError in Java, coming from JNI

  12. 12

    java.lang.UnsatisfiedLinkError: no kdu_jni in java.library.path

  13. 13

    java.lang.UnsatisfiedLinkError when running java command as sudo

  14. 14

    AndroidRuntime Caused by: java.lang.unsatisfiedLinkError: Couldn't load tfp_jni: findLibrary returned null

  15. 15

    Android Java NDK/JNI - UnsatisfiedLinkError: Native method not found [...] Ljava/lang/String;

  16. 16

    jni4net - java.lang.UnsatisfiedLinkError: net.sf.jni4net.Bridge.initDotNet()I

  17. 17

    java.lang.UnsatisfiedLinkError when loading native library in Android 5.0

  18. 18

    JSNI in GWT makes java.lang.UnsatisfiedLinkError when called

  19. 19

    java.lang.UnsatisfiedLinkError - when running z/OS application

  20. 20

    Using JavaCV and Realm together causes "java.lang.UnsatisfiedLinkError"

  21. 21

    JNI C++ UnsatisfiedLinkError When Calling Method

  22. 22

    JNI C++ UnsatisfiedLinkError When Calling Method

  23. 23

    UnsatisfiedLinkError with JNI

  24. 24

    OpenCV java.lang.UnsatisfiedLinkError

  25. 25

    eclipse: java.lang.UnsatisfiedLinkError

  26. 26

    UnsatisfiedLinkError when running SimGrid-Java example on Ubuntu

  27. 27

    java.lang.UnsatisfiedLinkError: No implementation found for java.lang.String when proguard enabled

  28. 28

    java.lang.UnsatisfiedLinkError: TestJni.print(LA;)V error on Ubuntu

  29. 29

    java.lang.UnsatisfiedLinkError: TestJni.print(LA;)V error on Ubuntu

HotTag

Archive