JNI Krise - keine Idee mehr

melmager

Erfahrenes Mitglied
Ich habe keine Idee mehr was Falsch läüft - ich Veruche schon seit Tagen irgendwas mit JNI zum laufen zubeommen.

immer kommt sowas:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no SettingVariables in java.library.path

Ich habe Jbulder unter Linux am laufen - und ja die so Datei ist im richtigen Verzeichnis denn er findet sie
Code:
class SettingVariables {

  public long _long = 1;
  private int _int = 2;

  public static long _static_long = 3;
  private static int _static_int = 4;

  public native void update();

  public void show() {
    System.out.println("public long _long               : "+_long);
    System.out.println("private int _int                : "+_int);
    System.out.println("public static long _static_long : "+_static_long);
    System.out.println("private static int _static_int  : "+_static_int);
  }
}

public class Main {

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

  public static void main(String[] args) {
    SettingVariables sv = new SettingVariables();

    System.out.println("\nbefore native call:");
    sv.show();

    sv.update(); // Aufruf einer nativen Methode

    System.out.println("\nafter native call:");
    sv.show();
  }
}
SettingVariables.h
Code:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class SettingVariables */

#ifndef _Included_SettingVariables
#define _Included_SettingVariables
#ifdef __cplusplus
extern "C" {
#endif
/* Inaccessible static: _static_long */
/* Inaccessible static: _static_int */
/*
 * Class:     SettingVariables
 * Method:    update
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_SettingVariables_update
  (JNIEnv *env, jobject thisObj );

#ifdef __cplusplus
}
#endif
#endif
das SettingVariables.c
Code:
#include "SettingVariables.h"

JNIEXPORT void JNICALL
Java_SettingVariables_update(JNIEnv *env, jobject thisObj) {

	jclass clazz;
	jfieldID fid_long;
	jfieldID fid_int;
	jfieldID fid_static_long;
	jfieldID fid_static_int;

	jint ji = 100;

	// Klassen-Zeiger holen
	clazz = (*env)->GetObjectClass(env, thisObj);

	// setzen der Non-Static Variablen
	fid_long = (*env)->GetFieldID(env, clazz, "_long", "J");
	fid_int = (*env)->GetFieldID(env, clazz, "_int", "I");

	(*env)->SetLongField(env, thisObj, fid_long, ji++);
	(*env)->SetIntField(env, thisObj, fid_int, ji++);

	// setzen der Static Variablen
	fid_static_long = (*env)->GetStaticFieldID(env, clazz, "_static_long", "J");
	fid_static_int = (*env)->GetStaticFieldID(env, clazz, "_static_int", "I");

	(*env)->SetStaticLongField(env, clazz, fid_static_long, ji++);
	(*env)->SetStaticIntField(env, clazz, fid_static_int, ji++);

}

und so den Compiler angeworfen
gcc -shared -I/home/wolfgang/JBuilder8/jdk1.4/include/ -I/home/wolfgang/JBuilder8/jdk1.4/include/linux/ SettingVariables.c

was mache ich falsch ?

den Code habe ich übrigends von eine Uniseite "geborgt"
 
Zuletzt bearbeitet:
ok ich habe es geschafft mal ein C Prorgamm mit JNI in Java einzugauen

ich werde mal in den nächsten Tagen meine Erkenntnisse zusammenfassen

denn nicht alles was online zu lesen war ist richtig :-(
ich habe jetze eine Variation von sicher 5 Webseiten am laufen

EDIT Kurzversion meiner Lösung:

das von javah erzeugte xxx.h file kopieren und daraus ein xxx.c machen
Nicht das xxx.h File im xxx.c File includen ! man kann das File links liegen lassen wird nicht weiter gebraucht.

So das Library erzeugen:
gcc -Wall -fPIC -I/javaverzeichnis/include -I/javaverzeichnisinclude/linux -c xxx.c -static
gcc -shared -Wl,-soname,xxx.so -o xxx.so xxx.o

xxx = Library und name der C Datei

Bei mir ging die Version mit
System.loadLibrary("testjni");
nicht owohl ich die so Datei in den von System.out.println(System.getProperty("java.library.path"));
angezeigen Verzeichnis war
ich nutze statt dessen:
System.load("/home/weitere/verzeichnisse//jniprojekt/classes/Jnimain.so");

und es geht :-)
 
Zuletzt bearbeitet:
Zurück