JNI UnsatisfiedLinkError

eQuest

Mitglied
Hi Community,

ich bastle gerade an einer Software, die mir Systemdaten (in dem Beispiel hier die Systemzeit) per JNI/C liefert und ich sie dann in Java ausgebe, wobei ich mir JNI mit Swig erstellen lasse. Ich arbeite auf Ubuntu 10.10.

Vorgehensweise:
Ich habe 2 Eclipse, eines für C, eines für Java. Als erstes habe ich ein "Shared Library Empty Project" erstellt, die C Sourcefile und danach die .i Datei, in der ich die Funktionen für Swig festlege, welche Java zugänglich gemacht werden sollen, geschrieben. Anschließend habe ich noch unter Project/Properties/C-C++ Build/Settings/GCC C Compiler/includes die openjdk includes hinzugefügt ("/usr/lib/jvm/java-6-openjdk/includes/linux" und nochmal ohne linux). Dann habe ich das ganze C Projekt gebuildet, dadurch wurden mir die *.o und die .so erstellt. Gut, nun habe ich im anderen Eclipse meine Java Anwendung geschrieben und die .java in den Debug Ordner des C Projekt verschoben (in dem auch die .so liegt). Anschließend noch javac gemacht und dann versucht, auszuführen.
Folgende Fehlermeldung:

Code:
greg@ubuntu:~/Software/Eclipse_C/workspace/Swigtestc/Debug$ java JNIJavaTester
Exception in thread "main" java.lang.UnsatisfiedLinkError: no libSwigtestc in java.library.path
	at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1681)
	at java.lang.Runtime.loadLibrary0(Runtime.java:840)
	at java.lang.System.loadLibrary(System.java:1047)
	at JNIJavaTester.main(JNIJavaTester.java:11)

Hier meine Dateien:

JNIJavaTester.java
Java:
public class JNIJavaTester {

	/**
	 * @param args
	 */
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//System.setProperty("java.library.path", "/home/greg/Software/Eclipse_C/workspace/Swigtestc/Debug");
		System.loadLibrary("libSwigtestc");
		System.out.println(example.get_time());
	}

}
Bei example.get_time() greife ich auf die Java Klasse zu, die mir Swig erstellt hat. Diese liegt auch im C Debug Verzeichnis.

example.c
Code:
#include <time.h>

double VAR = 3.0;

int fact(int n){
	if(n<=1) return 1;
	else return n*fact(n-1);
}

int my_mod(int x, int y){
	return (x%y);
}

char *get_time(){
	time_t ltime;
	time(&ltime);
	return ctime(&ltime);
}

example.i
Code:
%module example
%{
extern double VAR;
extern int fact(int n);
extern int my_mod(int x, int y);
extern char *get_time();
%}

extern double VAR;
extern int fact(int n);
extern int my_mod(int x, int y);
extern char *get_time();

Ich habe nun schon seit Stunden herumgespielt aber immer wieder bekomme ich die selbe Fehlermeldung.
Habt ihr irgendwelche Ideen?

danke schonma, greez
 

FArt

Top Contributor
Ich habe nun schon seit Stunden herumgespielt aber immer wieder bekomme ich die selbe Fehlermeldung.
Habt ihr irgendwelche Ideen?

danke schonma, greez

Verstehe ich nicht. Anstatt Stunden lang rumzuspielen hättest du mal googeln sollen: java unsatisfiedlinkerror - Google-Suche

Und bevor man einfach so unbedarft loslegt ist ein Tutorial nicht verkehrt: Chapter 5: JNI Technology

Noch dazu sagt die Fehlermeldung genau, wo das Problem liegt: no libSwigtestc in java.library.path

Gut, nun habe ich im anderen Eclipse meine Java Anwendung geschrieben und die .java in den Debug Ordner des C Projekt verschoben (in dem auch die .so liegt).
Was bringt das? Wo hast du das denn her?
 
Zuletzt bearbeitet:

eQuest

Mitglied
Verstehe ich nicht. Natürlich habe ich schon gegoogelt und es ist nichts dabei rausgekommen, sonst hätte ich ja hier nicht nachgefragt ~~

ich hatte die .java datei zuerst im workspace meines java eclipse. Als dann die .so nicht gefunden wurde, obwohl ich den library path gesetzt hatte, habe ich die datei einfach ma rüberkopiert um zu probieren, ob es dann vl. geht.

Und ja, wie du richtig erkannt hast, wird die .so nicht gefunden, nur wieso, wenn doch der library path gesetzt ist?
 
T

tuxedo

Gast
Ich sehe den Pfad nirgendwo gesetzt (nur auskommentiert).

Typischerweise gibt man beim start der JVM die Property mit an:

Code:
greg@ubuntu:~/Software/Eclipse_C/workspace/Swigtestc/Debug$ java -Djava.library.path=/mein/pfad/zur/so/datei JNIJavaTester
 

eQuest

Mitglied
@tuxedo: hatte ich auch schon ausprobiert, nutze nichts.

Ok danke jedenfalls für die Hilfestellungen, ich konnte das Problem lösen. Und zwar war es ein falscher Befehl ... Das Shared Object lädt man nämlich nicht mit System.loadLibrary(), sondern mit System.load(). Dieser erwartet dann einen absoluten Pfad inc dem lib davor im Namen der .so .
Nja ansonsten geht auch einfach die Bibliothek nach /usr/lib kopieren, da wird standardmäßig nachgesehen.

lg
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C OpenCV: UnsatisfiedLinkError Allgemeine Java-Themen 5
T Eclipse Dll einbinden java.lang.UnsatisfiedLinkError nur in Eclipse nicht via javac Allgemeine Java-Themen 1
T JNI UnsatisfiedLinkError ... undefined symbol: __cxa_pure_virtual Allgemeine Java-Themen 10
T JNI - UnsatisfiedLinkError Allgemeine Java-Themen 9
B JNI - java.lang.UnsatisfiedLinkError Allgemeine Java-Themen 21
Hindi93 Fehlermeldung UnsatisfiedLinkError Allgemeine Java-Themen 8
N Exception in thread "main" java.lang.UnsatisfiedLinkError: no lwjgl in java.library.p Allgemeine Java-Themen 4
heart_disease Probleme mit JNI: UnsatisfiedLinkError Allgemeine Java-Themen 6
L UnsatisfiedLinkError mal anders Allgemeine Java-Themen 4
I java.lang.UnsatisfiedLinkError: Allgemeine Java-Themen 8
J JNI: UNsatisfiedLinkError Allgemeine Java-Themen 3
D java.lang.UnsatisfiedLinkError Allgemeine Java-Themen 5
S java.lang.UnsatisfiedLinkError mit JNI Allgemeine Java-Themen 6
H JNI: loadLibrary liefert UnsatisfiedLinkError Allgemeine Java-Themen 2
T unsatisfiedlinkerror -> Diese Anwendung konnte nicht gest Allgemeine Java-Themen 2
K UnsatisfiedLinkError bei -> VTKInit Allgemeine Java-Themen 2
M JNI: nach verschieben in package UnsatisfiedLinkError Allgemeine Java-Themen 3
D JNI: UnsatisfiedLinkError Allgemeine Java-Themen 3
R JNI unsatisfiedLinkError Allgemeine Java-Themen 5

Ähnliche Java Themen


Oben