Question

I've looked around on stackoverflow for similar problems, but none of the solutions I've found seem to be working for me. I am on a Linux/Ubuntu machine. I'm just practising JNI but I get this error:

Exception in thread "main" java.lang.UnsatisfiedLinkError: nativetest.sayHello(Ljava/lang/String;)Ljava/lang/String;
at nativetest.sayHello(Native Method)
at nativetest.main(nativetest.java:8)

I have provided my .c, .h, and .java file.

.java file:

public class nativetest
{
System.loadLibrary("nativetest");

public native String sayHello(String s);

 public static void main(String[] argv)
 {
 String retval = null;
 nativetest nt = new nativetest();
 retval = nt.sayHello("Hi");
 System.out.println("Invocation returned " + retval);
 }
}

.c file:

#include "nativetest.h"
#include <stdio.h>
#include <jni.h>
#include <stdlib.h>

JNIEXPORT jstring JNICALL Java_nativetest_sayHello(JNIEnv *env, jobject thisobject, jstring js)
{
  return js;
}

.h file:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class nativetest */

#ifndef _Included_nativetest
#define _Included_nativetest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     nativetest
 * Method:    sayHello
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_nativetest_sayHello
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

I used these commands to generate the .h file, compile/generate the .so file, and run:

javac nativetest.java

javah -jni nativetest

gcc --shared -o libnativetest.so -I/usr/lib/jvm/java-7-openjdk-amd64/include -I/usr/lib/jvm/java-7-openjdk-amd64/include/linux nativetest.c

java -Djava.library.path=. nativetest

I am currently in the directory with the libnativetest.so file and all my .c, .java, and .h files.

Any help would be appreciated.

Was it helpful?

Solution

Okay, turns out the call to

System.loadLibrary("nativetest");

should be static:

static{
System.loadLibrary("nativetest");
}

I was also making mistakes on recompiling using javac. I am quite new to Linux :)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top