Hallo zusammen.
Ich habe ein Problem mit Java und nativen Bibliotheken. Das Problem ist ziemlich betriebssystemnah (...glaube ich...) und betrifft ein Thema, in dem ich mich nicht sehr heimisch fühle.
Folgende Situation:
Ich habe einige C-Bibliotheken die schon recht alt sind und NICHT threadsicher sind, sprich u.a. globale Variablen haben. Diese auszubessern ist aber erstmal keine Option... (es wäre auch ein Heidenaufwand).
Diese "darf" ich aus einer Java-Anwendung heraus aufrufen. Das ist erstmal kein Problem. Ich habe das bisher über JNI und
gemacht und es läuft auch.
Aber das konkrete Problem: Wenn ich meine Java-Anwendung mehrmals instanziieren will, geht das nicht, weil dies aus Sicht des Betriebssystem (BS) immernoch der gleiche Prozess ist und dieser die native Bib. schon dazu geladen hat. Sprich es wird nicht ein zweites mal neu geladen. Damit tun die nativen Bibs. aber nicht, weil sie sich eben (v.a. wegen der Globalen) überschneiden. Ich hab's getestet, das Ganze schmiert recht schnell mit einer Speicherschutzverletzung ab
Bisheriger Workaround: Es wird immer ein neuer Javaprozess (
...) gestartet, sodass die Bib. immer neu geladen wird. Das ist aber schlecht, weil ich a) zwei separate Prozesse hab und dazwischen nur schwer kommunizieren kann (Thema IPC) und auch zwei separate VMs (und u.A. mehr Speicherverbrauch).
Nun meine Fragen: Gibt es eine Möglichkeit, innerhalb einer VM ein Java-Programm mehrmals separat auszuführen, sodass das Laden einer nativen Lib. auch mehrmals möglich ist? Oder geht es z.B. gar nicht, weil dies eben eine Sache vom BS ist (habe es bisher unter Windows NT und Linux getestet).
Oder wisst ihr irgendwie Suchbegriffe, Literatur, ... irgendwas mit dem ich meine Suche mal fortsetzen kann, weil bisher bin ich auf dem Standpunkt geht nicht anders.
Also danke für eure Zeit.
Ich habe ein Problem mit Java und nativen Bibliotheken. Das Problem ist ziemlich betriebssystemnah (...glaube ich...) und betrifft ein Thema, in dem ich mich nicht sehr heimisch fühle.
Folgende Situation:
Ich habe einige C-Bibliotheken die schon recht alt sind und NICHT threadsicher sind, sprich u.a. globale Variablen haben. Diese auszubessern ist aber erstmal keine Option... (es wäre auch ein Heidenaufwand).
Diese "darf" ich aus einer Java-Anwendung heraus aufrufen. Das ist erstmal kein Problem. Ich habe das bisher über JNI und
Code:
System.loadLibrary()
Aber das konkrete Problem: Wenn ich meine Java-Anwendung mehrmals instanziieren will, geht das nicht, weil dies aus Sicht des Betriebssystem (BS) immernoch der gleiche Prozess ist und dieser die native Bib. schon dazu geladen hat. Sprich es wird nicht ein zweites mal neu geladen. Damit tun die nativen Bibs. aber nicht, weil sie sich eben (v.a. wegen der Globalen) überschneiden. Ich hab's getestet, das Ganze schmiert recht schnell mit einer Speicherschutzverletzung ab
Bisheriger Workaround: Es wird immer ein neuer Javaprozess (
Code:
Runtime.exec()
Nun meine Fragen: Gibt es eine Möglichkeit, innerhalb einer VM ein Java-Programm mehrmals separat auszuführen, sodass das Laden einer nativen Lib. auch mehrmals möglich ist? Oder geht es z.B. gar nicht, weil dies eben eine Sache vom BS ist (habe es bisher unter Windows NT und Linux getestet).
Oder wisst ihr irgendwie Suchbegriffe, Literatur, ... irgendwas mit dem ich meine Suche mal fortsetzen kann, weil bisher bin ich auf dem Standpunkt geht nicht anders.
Also danke für eure Zeit.