K
KrokoDiehl
Gast
Hallo auch,
ich habe ein Problem was das Java Native Interface (JNI) betrifft und dazu eine Frage.
Zunächst einmal doch die Beschreibung des Vorhandenen:
Ich habe ein Java-Programm dass mehrere Instanzen einer Klasse verwaltet. Diese Instanzen benutzen native Methoden aus einer C++ DLL. Das Benutzen der C++ Funktionen geht fehlerfrei, dahingehen habe ich keine Probleme.
Das Problem:
Ich möchte dass quasi jede Instanz meiner Java-Klasse ihre "eigene" Verbindung zu ihrer "eigenen" DLL hat. Ich habe dazu die loadLibrary()-Funktion nicht-statisch im Konstruktor der Java-Klasse eingebaut, sodass für jede Instanz die DLL neu geladen wird. Die DLL nun, um es einfach zu machen, bekommen einen String, einen Namen, und speichert den für die Laufzeit. Wenn ich aber nun mehrere Instanzen der Java-Klasse generiere und über die nativen Methoden den gespeicherten Namen abfrage, dann haben alle den Namen der zuletzt generierten Instanz.
Der (Beispiel-)Code:
Die Java-Klasse sieht wie folgt aus (hier nur der Konstruktor...):
Die C++ Implementierung wie folgt (die javah-generiere Header-Datei habe ich mal weggelassen):
Wenn ich nun mehrmals eine ShellFactory-Objekt erstelle und anschließend deren Namen (=ShellNummer) ausgeben will, kommt es zum eigentlichen Problem, hier Beispiel-Code:
Hier hätte ich gerne als Ausgabe "hallo du Typ", aber es kommt "Typ Typ Typ".
Ich hoffe ihr versteht mein Problem
und so folgt die Frage auf dem Fuß: geht das, was ich vorhabe überhaupt?!
ich habe ein Problem was das Java Native Interface (JNI) betrifft und dazu eine Frage.
Zunächst einmal doch die Beschreibung des Vorhandenen:
Ich habe ein Java-Programm dass mehrere Instanzen einer Klasse verwaltet. Diese Instanzen benutzen native Methoden aus einer C++ DLL. Das Benutzen der C++ Funktionen geht fehlerfrei, dahingehen habe ich keine Probleme.
Das Problem:
Ich möchte dass quasi jede Instanz meiner Java-Klasse ihre "eigene" Verbindung zu ihrer "eigenen" DLL hat. Ich habe dazu die loadLibrary()-Funktion nicht-statisch im Konstruktor der Java-Klasse eingebaut, sodass für jede Instanz die DLL neu geladen wird. Die DLL nun, um es einfach zu machen, bekommen einen String, einen Namen, und speichert den für die Laufzeit. Wenn ich aber nun mehrere Instanzen der Java-Klasse generiere und über die nativen Methoden den gespeicherten Namen abfrage, dann haben alle den Namen der zuletzt generierten Instanz.
Der (Beispiel-)Code:
Die Java-Klasse sieht wie folgt aus (hier nur der Konstruktor...):
Code:
public class ShellFactory
{
private native boolean createShell(String shellnr);
public native String getName();
public ShellFactory(String ShellNumber)
{
super();
try
{
System.load(LIB_NAME);
}
catch (UnsatisfiedLinkError ULErr)
{
System.out.println("Fehler beim laden der Bibliothek: "+LIB_NAME);
}
boolean l_createdShell = createShell(ShellNumber);
if (l_createdShell == false)
{
System.out.println("Anlegen der Shell mit Nr "+ShellNumber+" fehlgeschlagen.");
} //if !createdShell
} //Konstruktor(String)
} //class
Die C++ Implementierung wie folgt (die javah-generiere Header-Datei habe ich mal weggelassen):
Code:
char* shellNo = 0;
//- JNI FUNKTIONEN ------------------------------------------------------------------------------------------
JNIEXPORT jboolean JNICALL Java_abs_javaGUI_ShellFactory_createShell(JNIEnv* env, jobject obj, jstring shellNumber)
{
jboolean l_bIsCopy;
const char* l_shellNumber = env->GetStringUTFChars(shellNumber, &l_bIsCopy);
shellNo = strdup(l_shellNumber);
std::cout << "NAT createShell: " << l_shellNumber << std::endl;
return true;
} //JNIEXPORT jboolean JNICALL Java_javaGUI_ShellFactory_createShell(JNIEnv*, jobject, jstring)
Wenn ich nun mehrmals eine ShellFactory-Objekt erstelle und anschließend deren Namen (=ShellNummer) ausgeben will, kommt es zum eigentlichen Problem, hier Beispiel-Code:
Code:
ShellFactory hallo = new ShellFactory("Hallo");
ShellFactory du = new ShellFactory("du");
ShellFactory typ = new ShellFactory("Typ");
System.out.println( hallo.getName() );
System.out.println( du.getName() );
System.out.println( typ.getName() );
Hier hätte ich gerne als Ausgabe "hallo du Typ", aber es kommt "Typ Typ Typ".
Ich hoffe ihr versteht mein Problem