JNI: mehrere "Instanzen" einer C++ DLL?

Status
Nicht offen für weitere Antworten.
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...):
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 ;) und so folgt die Frage auf dem Fuß: geht das, was ich vorhabe überhaupt?!
 
A

Anmeldeboykottierer

Gast
Hi,
kann es sein, dass du einen wichtigen Teil ausgelassen hast, wie sieht denn getName() aus?
Die Dll mehrfach laden geht so nicht (das wiederspricht dem Sinn einer Shared-Library). Aber wenn du kannst natürlich in der Dll beliebig viel Speicher beantragen. Orientieren könntest du dich hier zum Beispiel am Windows API, da arbeitet man immer mit einem Handle (also eine int), in dem die quasie Referenz auf Element gespeichert wird.
Wenn du also den Speicher für den Namen für jede Instanz allozierst und auch wieder frei gibst, dann solltest du hier keine Probleme haben. Musst dann nur die Zuweisung auch speichern.

Gruß Der Anmeldeboykottierer
 
K

KrokoDiehl

Gast
Hallo und danke für die Antwort. Ich habe schon fast erwartet dass es so nicht geht. Werde schon eine andere Lösung finden ;)

Die getName()-Sache habe ich einfach nicht mitgepostet weil es ja nicht direkt ein JNI-Problem ist.

Gruß,
's KrokoDiehl
 
A

Anmeldeboykottierer

Gast
Die getName()-Sache ist indirekt ein JNI Problem. Wie gesagt, du kannst einfach eine Map für dieses getName verwenden. Du erstellst dir in der DLL einfach eine Art map, in der du zu jeder neuen Instanz eine ID zurückgibst (kann z.B. der Index sein, ein Schlüssel oder du nennst es Handle oder oder oder).
Wenn jetzt ein Zugriff stattfindet, dann halt unter Angabe dieser ID. Damit hast du dann wieder eine eindeutige Zuordnung (JNI macht es doch auch so, du holst dir ja auch nicht direkt die Instanz einer Java-Klasse sondern eine ID).

Gruß Der Anmeldeboykottierer
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B JUnit und mehrere Instanzen der selben Applikation Allgemeine Java-Themen 4
T Edit: JLabel+MouseListener oeffnet mehrere Instanzen Allgemeine Java-Themen 5
P Mehrere Instanzen der selben Appl. verhindern Allgemeine Java-Themen 12
C Mehrere Instanzen für einen Programm Allgemeine Java-Themen 3
X Mehrere Instanzen erzeugen Allgemeine Java-Themen 6
P Mehrere Instanzen beim IE verhindern Allgemeine Java-Themen 11
I Mehrere Klassen mit den selben Daten Allgemeine Java-Themen 5
berserkerdq2 Ist es schlechter Programmierstyle mehrere Panes aufeinander zu machen? Allgemeine Java-Themen 1
Tarrew OpenAPI Schnittstelle - Mehrere Kunden mit unterschiedlichen Zugriffsrechten Allgemeine Java-Themen 2
A Mehrere for-Schleifen Allgemeine Java-Themen 2
M Mehrere Sounds Allgemeine Java-Themen 3
M Mehrere Ressourcen in einem package ablegen Allgemeine Java-Themen 1
Avalon DTO aus mehrere Entitäten erstellen Allgemeine Java-Themen 5
H Mehrere PNG-Files in einer Datei Allgemeine Java-Themen 9
H Mehrere Datentypen in einer Arraylist speichern Allgemeine Java-Themen 9
Curtis_MC Collections Liste anhand mehrere Kriterien sortieren Allgemeine Java-Themen 6
bueseb84 Git : Mehrere Server verwenden Allgemeine Java-Themen 3
L Mehrere .Jar Files aufrufen Allgemeine Java-Themen 9
L mehrere Methoden Allgemeine Java-Themen 19
W Variablenübergabe über mehrere Klassen Allgemeine Java-Themen 4
B StAX Parser - mehrere Methoden, ein XML Allgemeine Java-Themen 4
T String mehrere Worte Allgemeine Java-Themen 2
N Bei Mouse Events nicht mehrere Objekte erstellen Allgemeine Java-Themen 13
J Variablen Mehrere int-variablen in txt abspeichern und danach wieder auslesen Allgemeine Java-Themen 1
S JTable - mehrere ausgewählte Rows in ArrayList Allgemeine Java-Themen 5
H Java FX 2 Fragen um Programm in mehrere sprachen zu übersetzen in Gluon Framwork Allgemeine Java-Themen 3
F Listen - Mehrere Objekte Allgemeine Java-Themen 1
R Variable durch mehrere Methoden ändern und nutzen Allgemeine Java-Themen 17
S libGDX mehrere Texturen zu Einer zusammenfassen Allgemeine Java-Themen 0
X Mehrere booleans in Datei Speichern, Updaten und Laden Allgemeine Java-Themen 1
OnDemand CSV parsen mehrere Zeilen Allgemeine Java-Themen 22
K Mehrere Programmiersprachen gleichzeitig lernen Allgemeine Java-Themen 3
C Mehrere Seiten drucken in Hoch- und Querformat Allgemeine Java-Themen 0
perlenfischer1984 Mehrere Komponenten erstellen Allgemeine Java-Themen 3
F AWT Mehrere Tastatureingaben verarbeiten Allgemeine Java-Themen 5
J Mehrere Wörter getrennt in eine Array einlesen, wie ? Allgemeine Java-Themen 7
HarleyDavidson Best Practice Integer-Zahlenfolge über mehrere Programmstarts Allgemeine Java-Themen 7
F Mehrere JTables' drucken Allgemeine Java-Themen 0
2 mehrere Json Werte Parsen Allgemeine Java-Themen 3
stylegangsta Mehrere html seiten einer Homepage einlesen und als Textdatei ausgeben Allgemeine Java-Themen 14
P Mehrere Java Versionen auf dem Rechner Allgemeine Java-Themen 3
B JAVA - mehrere Clienten gleichzeitig starten. Nicht bei Code! Allgemeine Java-Themen 3
S PrintWriter.println() schreibt mehrere Zeilen Allgemeine Java-Themen 19
2 Mehrere Uhrzeiten Sortieren Allgemeine Java-Themen 2
T Jsoup: Mehrere Links nacheinander parsen Allgemeine Java-Themen 11
T Schlüsselworte mehrere public-Klassen in einem Paket Allgemeine Java-Themen 7
E Lesen von mehrere Csv-Datei und ihre Inhalte vergleichen Allgemeine Java-Themen 3
K GUI-Entwicklung - Dispose, enabling und mehrere Controller Allgemeine Java-Themen 1
M Eclipse Mehrere Threads, mehrere Konsolen Allgemeine Java-Themen 4
A Threads Lock über mehrere Abschnitte in verschiedenen Methoden Allgemeine Java-Themen 5
H Mehrere Bilder aus einer Datei lesen Allgemeine Java-Themen 2
B Mehrere Objekte verschlüsselt serialisieren Allgemeine Java-Themen 6
S Tool um mehrere Klassen in einer Klasse vereinen? Allgemeine Java-Themen 6
K Mehrere Arrays auf einmal erstellen Allgemeine Java-Themen 2
R ListIterator über mehrere Arrays Allgemeine Java-Themen 13
J JFreeChart - Mehrere X-Achsen Einteilungen Allgemeine Java-Themen 3
S Mehrere Shapes "malen" Allgemeine Java-Themen 3
M Input/Output Mehrere Bilder aus Resourcen auslesen Allgemeine Java-Themen 8
J Erste Schritte Mehrere Mauszeiger für Ping Pong Game Allgemeine Java-Themen 7
P Mehrere MP3s abspielen Allgemeine Java-Themen 3
M Mehrere CRLF entfernen Allgemeine Java-Themen 13
F Mehrere Threads - ein Stack Allgemeine Java-Themen 6
K Mehrere JVMs die auf eine Klasse mit statischen Variablen zugreift Allgemeine Java-Themen 19
G mehrere Threads starten/stoppen Allgemeine Java-Themen 4
A Email versenden mehrere Zeilen Allgemeine Java-Themen 10
D Mehrere String-Werte in eine Tabellen-Zelle schreiben Allgemeine Java-Themen 8
R JTree - Mehrere Roots Allgemeine Java-Themen 6
Beckenbauer Mehrere Paragraphe in eine Word Datei schreiben Allgemeine Java-Themen 4
H Mehrere Anwendungen von Java kontrollieren lassen Allgemeine Java-Themen 10
O split mit einem ODER mehrere Tabulatoren oder Leerzeichen Allgemeine Java-Themen 6
M JFreeChart mehrere PieCharts erstellen Allgemeine Java-Themen 2
S Wie kann ein Observer mehrere Observables beobachten? Allgemeine Java-Themen 9
T Synchronisation von Listen bei Zugriffen durch mehrere Prozesse Allgemeine Java-Themen 15
D befehl auf mehrere objekte anwenden Allgemeine Java-Themen 7
B mehrere services in einem client Allgemeine Java-Themen 10
Meldanor Speichern der Datenbank - Lohnen sich mehrere Threads? Allgemeine Java-Themen 2
G Process - mehrere Commands?! Allgemeine Java-Themen 2
O Mehrere Exemplare(Kopieen) drucken Allgemeine Java-Themen 2
S log4j Logging über mehrere Klassen Allgemeine Java-Themen 13
F 1 Key - mehrere Values Allgemeine Java-Themen 3
G JOGL mehrere GLCanvas erstellen Allgemeine Java-Themen 2
S Mehrere Listen ineinander verschachteln Allgemeine Java-Themen 22
P Java3D mehrere Ebenen parallel zu yz-Ebene Allgemeine Java-Themen 9
R mehrere jar Dateien kompinieren Allgemeine Java-Themen 14
M Scanner-Methode: Mehrere Eingaben mit Exception behandeln Allgemeine Java-Themen 10
I Wie kann ich mehrere Mp3 Tags ausgeben? Allgemeine Java-Themen 6
I Mehrere MP3 Dateien einlesen? Allgemeine Java-Themen 3
G String.replaceall - mehrere Zeichen durch eines ersetzen Allgemeine Java-Themen 5
C ArrayList sortieren (mehrere Kriterien) Allgemeine Java-Themen 6
N mehrere klassen extenden Allgemeine Java-Themen 33
G Oracle will mehrere hundert Produkte patchen Allgemeine Java-Themen 5
F Logger in mehrere Dateien mit log4J Allgemeine Java-Themen 4
W Properties-Klasse: mehrere Parameter-Belegungen übergeben? Allgemeine Java-Themen 2
Daniel_L Mehrere (XML-)Datei aus einer ZIP-Datei auslesen Allgemeine Java-Themen 4
V Mehrere main() in jar, wie starten? Allgemeine Java-Themen 4
A Problem: Mehrere PDF-Files nacheinander Öffnen Allgemeine Java-Themen 12
D Mit Linux mehrere Kommandos in einem Subprozeß Allgemeine Java-Themen 3
D Suche sowas wie Map nur für mehrere Werte Allgemeine Java-Themen 13
V JFilechooser, mehrere Datein selektieren und Reihenfolge? Allgemeine Java-Themen 2
G mehrere Threads verwalten? Allgemeine Java-Themen 14

Ähnliche Java Themen

Neue Themen


Oben